2

2000行のファイルがあります。私は100行ごとにファイルを分割するために以下を使用しています。

split -l 100 file.txt outputfile.txt

各ファイルの内容の最後に「FFFFFF」を追加したいと思います。分割後も、上記のコマンドのように、ファイルが使用する拡張子を指定したいと思います。出力は次のようになります。

outputfile.txtxa, outputfile.txtxb etc...

分割のマニュアルページを読み、Webも閲覧しましたが、解決策が見つかりません。

任意の提案をいただければ幸いです。

4

2 に答える 2

2

ワンパスソリューションの場合、次のように使用できますawk

awk 'NR%100==1 { ++i } { print $0 (NR%100==0 ? "\nFFFFFF" : "") > "outputfile" i ".txt" }' file.txt

また、ここでの利点は、出力ファイル名をより細かく制御して、よりきれいにすることです。もっと凝ったものが必要な場合はお知らせください。乾杯。


user1937の説明:

モジュロ演算子に精通している場合はNR%100==1、1行目、101行目、201行目、301行目などに対してtrueを返します。trueになるたびに、変数iがインクリメントされます。awkステートメントが条件/アクションブロックで構成されていることに注目してください。NR%100==1条件++iもアクションもそうです。次に気付くのは(うまくいけば)、印刷アクションを持つブロックに条件がないことです。したがって、入力のすべての行が(常に)印刷されます。の値はi、出力が印刷されるファイルを決定するだけです。

あなたがよく知らないかもしれないもう一つのビットは次のとおりです:(NR%100==0 ? "\nFFFFFF" : "")。これは、 次の省略形の3項演算子if (NR%100==0) print "\nFFFFFF"; else print "")です。HTH。


awkコードは、次の形式のパターン/アクションステートメントを使用して構築できます。

NR%100==1                             # pattern1
{
    ++i                               # action1
}

{
    print $0 ...                      # action2
}

ご覧のとおり、pattern1はaction1にのみ適用されます。pattern1はaction2には適用されません。

于 2013-01-07T02:21:53.080 に答える
1

スプリットだけではそれはできません。このコードは役立つかもしれません:

split -l 100 file.txt outputfile_
find . -name outputfile_\* -exec sh -c 'echo "FFFFFF" >> {} && mv {} {}.txt' \;

これにより、ファイルなどが作成されoutputfile_aa.txtoutputfileab.txtすべてがで終わりFFFFFFます。

これは次のように機能します。最初にファイルをプレフィックスで分割してファイルなどoutputfile_を生成します。次に、コマンドを呼び出してそれらをすべて収集し、それを使用してコマンドを実行します。findコマンド内でリダイレクトを使用できないというわずかな問題があるため、リダイレクトをシェルスクリプトにラップし、すべてを。で実行します。は個々のファイル名に置き換えられます(のマニュアルページで探してください)。したがって、スクリプトは最初にファイルの最後に文字列を追加し、次にファイルの名前を変更して拡張子を追加します。outputfile_aaoutputfile_abfindsh{}-execfindFFFFFFtxt

于 2013-01-07T02:10:31.763 に答える