web-dev-qa-db-ja.com

すべてのコマンドの後に改行を配置する

各コマンドの出力が次から分離されるように、シェルスクリプトのすべての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

..これは確かに望ましくありません。

5
KMoy

シェルスクリプト内から実行している場合、各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

7
heemayl

そうすることができるからといって、代替アプローチをとることができます。

NRおよびFNR変数を使用したARGIND

このアプローチはファイルを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

END句の使用

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

連想配列を使用したENDブロックのバリエーション

$ 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
1