awkを使用して同じユーザーに関連する特定の列の内容のみを印刷するにはどうすればよいですか?

awkを使用して同じユーザーに関連する特定の列の内容のみを印刷するにはどうすればよいですか?

次の列があります。

User    ColumnA  ColumnB  ComumnC
abc123  hi       hello    howdy?
xyz123  Namaste  que paso rowdy?
abc123  hi       hello    bowdy?

次のように、3列のabc123に関連する内容を印刷するgawkスクリプトを作成したいと思います。

User: abc123
    howdy?
    bowdy?

これまで私はこれを得ました:

gawk '/^[a-z]{3}[0-9]{3}/ { 
    temp=$1
    printf ("User:  %s\n", $1); 
    printf ("\t %s\n", $4)
}' $1

ただし、列の同じユーザーの内容をマージするのではなく、列のすべてのユーザーと各行にその内容を印刷します。

User: abc123
    howdy?
User: xyz123
    rowdy?
User: abc123
    bowdy?

どんな提案がありますか?

答え1

使用awk:

awk -F'\t' '
NR>1{
    if(!o[$1]) {o[$1]="User: "$1"\n\t"$4}
    else {o[$1]=o[$1]"\n\t"$4}
}
END { for (i in o) print o[i] }
' file

出力:

User:abc123
    howdy?
    bowdy?
User:xyz123
    howdy?

答え2

ここにあります:

# Save the filename
filen="test.txt"
# Save the column name
col_name="$(head -n1 $filen|awk '{print $1}')"
# Save the target word
to_find="abc123"
echo "$col_name: $to_find" ; for name in $(grep $to_find $filen | awk '{print $4}'); do echo "  $name"; done

テキストの例:

User    ColumnA  ColumnB  ComumnC
abc123  hi       hello    howdy?
xyz123  Namaste  que paso rowdy?
abc123  hi       hello    bowdy?

出力:

User: abc123
  howdy?
  bowdy?

関連情報