各コマンドの出力が次から分離されるように、シェルスクリプトのすべてのawkコマンドでキャリッジリターンまたは改行リターンを実装するにはどうすればよいですか?
おそらくもっと仕様が必要でしょう。次の2つのawkコマンドがあります。
awk {print $1, $2}
、awkコマンド1、出力:
John Bender
Bohn Jender
Jen Bondher
awk '{print $3, $4}'
、コマンド2、出力:
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543
シェルスクリプトで結合し、./<testscript>.sh <textfile>
で実行すると、コマンドラインは明らかに次を出力します。
John Bender
Bohn Jender
Jen Bondher
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543
改行を追加するPER awkコマンドが必要なため、出力は次のようになります:
John Bender
Bohn Jender
Jen Bondher
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543
「\ n」を追加する以前の試みの結果は次のとおりです。
John Bender
Bohn Jender
Jen Bondher
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543
..これは確かに望ましくありません。
シェルスクリプト内から実行している場合、各echo
コマンドの後にawk
を追加します。つまり、個別の出力を取得するコマンドの間に追加します。 echo
は改行を追加します。例えば:
awk '{print $1 $2}' file.txt
echo
awk '{print $3, $4}' file.txt
元の回答:
各awk
アクションprintf "\n"
の最後に{}
を追加します。
printf "\n"
は改行を出力します。
例:
% awk '{print $1; printf "\n"}' <<<$'foo bar\nspam Egg'
foo
spam
そうすることができるからといって、代替アプローチをとることができます。
このアプローチはファイルを2回実行し、ファイルを2回実行した時点で改行を出力します。これは、いくつかの興味深いアイデアを使用して実現されます。
同じファイルを処理し、異なる情報を抽出する場合、ファイルはコマンドラインで2回指定されます。
最初のファイル(フィールド$ 1と$ 2を抽出するため)を実行するときと、2番目のファイルを実行するときをどのように区別しますか? ARGIND
変数を使用して。
NR
はこれまでに処理された合計レコードであり、FNR
は現在のファイルで処理された合計レコードです。最初のファイルでは、それらは同じですが、いつ異なるのでしょうか? 2番目のファイルに到達したとき。現時点では、改行を印刷する必要がありますが、何らかの形でNR > FNR
のような他の値については改行を印刷しないようにします。フラグを立てます(フラグ変数を使用)。
サンプル出力:
$ awk '!flag && NR>FNR {print "";flag=1} ARGIND==1{print $1,$2}ARGIND==2{print $3,$4}' data.txt data.txt
John Bender
Bohn Jender
Jen Bondher
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543
Heemayls回答のコメントで述べたように、2つの別々のawkコマンドを使用する場合、ファイルの処理が完了したらEND
ブロックを使用して何かを出力できます。
$ awk '{print $1,$2}END{print "\n"}' data.txt; awk '{print $3,$4}' data.txt
John Bender
Bohn Jender
Jen Bondher
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543
$ 3ブロックは基本的に何度も同じもの(文字列 "AGE")であるため、保存する必要はありませんが、$ 4を連想配列に保存できます。次に、ENDブロックで、改行を印刷した後、保存された値を反復処理できます。
$ awk '{print $1,$2;age[i++]=$4}END{print"";for(var in age) print "AGE",age[var]}' data.txt
John Bender
Bohn Jender
Jen Bondher
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543