2012-03-01 9 views
2

行の最初の2文字をファイル名としてNファイルに分割する方法を教えてください。Unix - regexpを使用してN個のファイルに分割して宛先ファイルを指定する

AA.txt

AA23409234TEXT 
AA23509234YADA 

BA.txt

BA23201202Other Text 
BA23202202More Text. 

C1.txt

AA23409234TEXT 
BA23201202Other Text 
AA23509234YADA 
BA23202202More Text. 
C1000000000000000000 

3つのファイルを生成する必要があります:

例入力ファイルが

C1000000000000000000 

私はこの

/^(..)/w \1 

に似たsedスクリプトを使用して考えしかし、どのようなことが本当にありませんが代わりにキャプチャグループの「\ 1」という名前のファイルを作成していますよ。

アイデア?

答えて

4
$ awk '{fname=substr($0, 0, 2); print >>fname}' input.txt 

それとも

$ while read line; do echo "$line" >>"${line:0:2}"; done <input.txt 
+0

感謝を。 3番目のparamをsubstrに3増やさなければならなかったのですが、ファイル名は1文字しかなかったからです。 –

+0

4 awk行:「N」の数に依存します。巨大な数の場合は、「あまりにも多くのファイルを開く」のようなエラーが発生する可能性があります。 close()を使用すると回避できます。しかし、少数のファイルに対しては、awk行は問題ありません。しかし、良い解決策。 – Kent

+0

awkの「オープンファイルが多すぎます」というエラーが発生しました。もちろん、これは、私の '制作'の問題が3よりもかなり多くの文字を含んでいたためです。 –

0

あなたがする必要がある最初の事はあなたのすべてのファイル名を決定します:

filenames=$(sed 's/\(..\).*/\1/' listOfStrings.txt | sort | uniq) 

そして、それらのファイル名をループ

for filename in $filenames 
do 
    sed -n '/^$filename/ p' listOfStrings.txt > $filename.txt 
done 

私はこれをテストしていないが、私はそれがshouと思う仕事。

sed 's/\(..\).*/echo "&" >>\1.txt/' file | sh 

をしたり、持っている場合はGNU sedのは::

+0

'filenames = $(grep -o"^.. "filename | sort -u)'を使うことができます。ただし、ファイルを複数回スキャンしているため、パフォーマンスが低下します。 –

0

これはあなたのために働くかもしれないそれをやった

sed 's/\(..\).*/echo "&" >>\1.txt/e' file 
関連する問題