web-dev-qa-db-ja.com

AWKを使用して列をインクリメントする方法

次のファイルパターンがあります。

insert_buffer cell_a 
insert_buffer cell_b
insert_buffer cell_b
...

各行の最後に、番号を1つ増やした列を1つ追加します。 e.x. 0、1、2、3 ...:

insert_buffer cell_a name_0
insert_buffer cell_b name_1
insert_buffer cell_b name_2
...

Awkを使用してforループを実行するにはどうすればよいですか?または、他の解決策でも問題ありません。

4
Bryan
$ awk '{$(NF+1) = "name_"(NR-1)} 1' file
insert_buffer cell_a name_0
insert_buffer cell_b name_1
insert_buffer cell_b name_2

組み込みのレコード数NRの代わりに独自の変数を使用する場合は、たとえば

$ awk '{$(NF+1) = "name_"i++} 1' file
insert_buffer cell_a name_0
insert_buffer cell_b name_1
insert_buffer cell_b name_2

新しいフィールドを別の場所に挿入する場合、そのための1つの方法は、追加の出力フィールドセパレータOFSとともに、既存のフィールドに追加または追加することです。 2番目のフィールドの前に挿入します

$ awk '{$2 = "name_"i++ OFS $2 } 1' file
insert_buffer name_0 cell_a
insert_buffer name_1 cell_b
insert_buffer name_2 cell_b
4
steeldriver

これは、以下のようにsedエディターを使用して実行できます。

sedには算術の概念がないため、他の方法で実行できることに注意してください。

the variable $n stores the column number where you want the new data placed.

n=2;
sed -ne 1i\\ -e 0 -e p\;= yourfile |\
sed -nE "N;s/\S\+/&\n/$n;s/\(.*\)\n\(.*\)\n/\2 name_\1 /p"

結果

insert_buffer name_0  cell_a
insert_buffer name_1  cell_b
insert_buffer name_2  cell_c
1
user218374