2

私はまだこの種の仕事に慣れていませんが、リソースを使い果たしたので、助けの手を差し伸べています.

連結されたファイルで構成される単一のファイルがあります。以下の正確なコード行を使用して、ファイルを分割できます。

awk "/PATTERN/{x="F"++i;}{print > x;}" sourceFile

しかし -

  1. 可能であれば、出力ファイルのディレクトリを指示したいと思います。上記のスクリプトは、出力ファイルを「sourceFile」ディレクトリに書き込みます。これらのファイルを何らかの一時ディレクトリにドロップする必要があります。

  2. 出力ファイルが "sourceFile" 名を保持し、おそらく末尾にカウンターを付けて、.txt ファイル タイプ (sourceFile1.txt、sourceFile2.txt など) を維持できると非常に便利です。

sourceFile 名を保持するために次のことを試みましたが、失敗しました。

set F=sourceFile
awk "/PATTERN/{x="F"++i;}{print > x;}" sourceFile

これが初歩的である場合は申し訳ありませんが、これは日常のタスクに大いに役立つ可能性があるため、誰かが助けてくれることを望んでいました. 前もって感謝します!

4

2 に答える 2

1

dir と Filename を設定する場合、awk はシェル変数を受け入れることができます。

D="/path/to/newfiles/"
F="sourceFile"

awk -v d="$D" -v f="$F" '/PATTERN/{x=d f (++i)}{print > x;}' sourceFile

現在、ターゲットディレクトリとファイル名は動的であるため、awk 呼び出しの前に適切な値に設定できます。

しかし、注意すべきことがもう 1 つあります。あなたのファイルにいくつありますかPATTERN。ファイルが多すぎる場合は、"too many files opened" のようなエラー メッセージが表示されます。この場合、新しいファイルに書き込む前に最後のファイルを閉じる必要があります。

于 2013-04-29T19:39:04.067 に答える
1

ファイル名にディレクトリのプレフィックスを付け、文字列連結を使用してファイル拡張子を追加するだけです。

awk '/PATTERN/{file="tmp/"(FILENAME)(++i)".txt"}{print > file}' sourceFile

入力ファイルにシェル変数を使用する必要はありません。代わりにawk変数を使用できます。FILENAME

デモ:

$ cat sourceFile 
PATTERN sf1
sf1
sf1
sf1
PATTERN sf2
sf2
sf2
PATTERN sf3
sf3
sf3

$ awk '/PATTERN/{file="tmp/"(FILENAME)(++i)".txt"}{print > file}' sourceFile

$ cat tmp/sourceFile1.txt
PATTERN sf1
sf1
sf1
sf1

$ cat tmp/sourceFile2.txt 
PATTERN sf2
sf2
sf2

$ cat tmp/sourceFile3.txt 
PATTERN sf3
sf3
sf3
于 2013-04-29T19:35:49.153 に答える