
誰かがこれが何をしているのか教えてもらえますか?
cat infile|
awk '
{
for(i=3;i<=NF;i++){ $2=$2" "$i }
printf "%-4s %s\n", $1,$2 ;
}' > outfile.txt
infile
含む:
1 John Smith
2 Bill Johnson
...
5000 George Heiz
その結果、すべての線が揃っていることがわかりますが、この部分が正確に何をしているのかoutfile.txt
わかりません。for(i=3;i<=NF;i++){ $2=$2" "$i }
答え1
この awk スクリプトは複雑で非効率的なアプローチなので、次のように書き直すことができます。
awk '
{
f=$1
$1=""
printf "%4d %s\n",f,$0 ;
}' infile > outfile.txt
後者のスクリプトはf変数の最初のフィールドを記録し、それを消去してから4文字でソートされたf変数を印刷し、元の行の残りの部分は変更されません。
作成者がレコードの残りの部分を維持しながら最初のフィールドをフォーマットする方法を理解していないようであるため、残りのフィールドはすべて奇数ループを使用して2番目のフィールドに配置します。
編集する:
riciはより簡単な方法を提案した。
awk '{$1 = sprintf("%4d", $1); print}' infile > outfile.txt
これは、最初のフィールドをフォーマットされた表現に置き換え、対応する行を出力します。
答え2
これらのawk
スクリプトでは、何が起こっているのかを確認するためにスクリプトを分解することが常に最善です。
印刷機能
これは簡単です。これにより、元の列の出力形式が指定$1
され、4つの空白を占めるように$2
列が埋められます。$1
はい
$ cat infile | awk '
{
for(i=3;i<=NF;i++){ $2=$2" "$i }
printf "%-4s DDD\n", $1 ;
}'
1 DDD
2 DDD
DDD
5000 DDD
forループ
これは検出が少し難しいですが、3つ以上の列を取得して列に接続します$2
。
$ cat infile | awk '
{
for(i=3;i<=NF;i++){ $2=$2" "$i }
printf "%s | %s\n", $2,$3 ;
}'
John Smith | Smith
Bill Johnson | Johnson
|
George Heiz | Heiz
これは少し簡単になりますが、実際に4番目の列を追加するとはるかに明確にinfile
なります。
$ cat infile
1 John Smith 4thcol
2 Bill Johnson 4thcol
5000 George Heiz 4thcol
はい
$ cat infile | awk '
{
for(i=3;i<=NF;i++){ $2=$2" "$i }
printf "%s\t|\t%s\n", $2,$3 ;
}'
John Smith 4thcol | Smith
Bill Johnson 4thcol | Johnson
|
George Heiz 4thcol | Heiz
列5などを追加すると、引き続きに追加されます$2
。
答え3
書式設定コマンドをprintf
最初のパラメータ文字列として渡します。 %-4s
出力に 4 文字が割り当てられ、左揃えであることを示します。その後、空白があり、後ろに表示される文字列が続きます%s
。