複数の行/行を持つファイルがあり、各行にはさまざまな数の列が含まれています。
Name1 String111 String112
Name2 String121 String122 String123
Name3 String131 String132 String133 String134
など(どの行にいくつの項目があるかについてのパターンはありません)。最初の列の名前をその行/行の各列の先頭に追加して、次のように終了したいと思います。
Name1 Name1String111 Name1String112
Name2 Name2String121 Name2String122 Name2String123
Name3 Name3String131 Name3String132 Name3String133 Name3String134
簡単に始めて、さらに複雑にすることができます。
各列の先頭に「Test」などの文字列をどのように追加できますか?
列1の値を列1を含む行のすべての列にどのように追加しますか?
列1の値を行のすべての列(列1を除く)にどのように追加しますか?
私の推測は次のとおりです。
「すべての列」を呼び出す方法やコマンドが現在の列にアクセスする方法がわからないため、列1の文字列または値を他の単一列にのみ追加できます。
awk -F'\t' -vOFS='\t' '{ !$1 = "hello" $2}'
awk -F'\t' -vOFS='\t' '{ !$1 = $1 $2}'
この構文を学ぶのに良いリソースがありますか?
ベストアンサー1
2番目のフィールドから始めてすべてのフィールドを繰り返し、最初のフィールドをすでに存在するフィールドに結合します。
$ awk '{ for(i=2;i<=NF;i++){ $i = $1$i }}1' file
Name1 Name1String111 Name1String112
Name2 Name2String121 Name2String122 Name2String123
Name3 Name3String131 Name3String132 Name3String133 Name3String134
最後に、1
awkの「現在の行印刷」の略語です。次のように同じ内容を作成できます。
$ awk '{ for(i=2;i<=NF;i++){ $i = $1$i }; print}' file
Name1 Name1String111 Name1String112
Name2 Name2String121 Name2String122 Name2String123
Name3 Name3String131 Name3String132 Name3String133 Name3String134
上記の基本的なアイデアは、すべての例に合わせて簡単に拡張できます。NF
フィールド数を保持する特別な awk 変数です。現在の行のフィールド数に関係なく、常に設定されます。その後、awk
変数を使用して特定のフィールドを参照できます。したがって、を設定するとi=5
同じ$i
です$5
。その後、for(i=2;i<=NF;i++) { }
すべての数値をその行のフィールド数に設定する形式を使用して、すべてのフィールドを繰り返すことができます。i
2