これはギャップをどのようにソートしますか?

これはギャップをどのようにソートしますか?

誰かがこれが何をしているのか教えてもらえますか?

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

関連情報