スポンサーリンク

for文でn列目以降を出力するのが楽

※awkの使い方をまとめて一覧にしました。
参考:awk入門-使い方まとめ一覧-

列変数を使って、$1,$2,$3,,,というようにprint出力するのもできますが、
手間もかかり限界もありますね。
参考:awkの$0,$1,$2,$3,変数で列の操作

for文を使うと良いと思いますが、ポイントを書いてみます。

1行の列数はNF変数で取得できるので、下記のように、i <= NFとloop条件を指定します。 参考:awkのNF変数で列数に応じた処理をする

		for(i = startRow; i <= NF; i++){
			printf $i
			〜省略〜
		}
		〜省略〜

また、print出力だと改行が入るので、printfを使うと良いですね。
更に、printfなので区切り文字の設定も必要ですね。今回はカンマにしました。
そして、最終列を除外して区切り文字を出力する必要もあります。

		for(i = startRow; i <= NF; i++){
			〜省略〜
			
			#最終列を除外して、区切り文字を出力
			if(i != NF){
				printf ","
			}
		}
		〜省略〜

1行毎に、改行も必要なので、下記のように設定します。
参考:awkのprintfで改行を付与する

		for(i = startRow; i <= NF; i++){
			〜省略〜
		}
		#改行をする
		printf "\n"

スポンサーリンク

サンプルコード

例えば、下記のin.txtがあったとします。

$ cat in.txt 
1 awk find grep 5
2 ls cp mv 2
3 or and not 3
$ cat sample.awk 

下記がサンプルコードになります。
2列目以降を出力しています。
#!/bin/sh
cat in.txt | awk '
	BEGIN{
		startRow = 2
	}
	{
		for(i = startRow; i <= NF; i++){
			printf $i
			
			#最終列を除外して、区切り文字を出力
			if(i != NF){
				printf ","
			}
		}
		
		#改行をする
		printf "\n"
	}
'

下記が実行結果になります。
$ ./sample.awk 
awk,find,grep,5
ls,cp,mv,2
or,and,not,3

スポンサーリンク