このコマンドを使用してcsv形式で出力を取得します。
awk 'ORS="," {print $2}'
次の形式で出力されます。
a,b,c,name,col1,col2,col3,
ここでは、「name」と「name」の前のすべての項目を削除し、列名のみを取得したいと思います。列名には削除したくない動作する「名前」があるかもしれません。したがって、名前が最初に表示される部分のみを削除できます。 awkでできますか?
私は試した:
awk 'NR >4 {print $2}' | awk '{ORS=","}'
さまざまな組み合わせが可能ですが、何も機能しません。
答え1
元のファイルの各行にある2番目のフィールドである場合は、そのフィールドを選択しながらテストできますa,b,c,name,col1,col2,col3,
(これでもまだ迷惑な最後のカンマが残ります)。name
$ awk -vORS=, 'p {print $2}; $2 == "name" {p=1} ' input; echo
col1,col2,col3,
したがって、awk 'ORS="," {print $2}'
持っている項目()から始めて、その項目が表示されていることをp
確認するテスト変数を追加します。name
2番目のフィールドは、以前にtrue値に設定されている場合にのみ印刷し、p
2番目のフィールドがあればtrueに設定しますname
。この順序でテストすると、name
列自体は印刷されません。p {print $2}
に変更して、入力の空白行を無視することもできます$0 && p {print $2}
。つまり、印刷条件として実際の(空ではない)入力行が含まれますp
。
ここでは、元の入力が次のようになると仮定します。
x a
x b
x c
x name
x col1
x col2
x col3
または、カンマで区切られたリストから始めてくださいa,b,c,name,somename,othername,col3,
。
$ echo 'a,b,c,name,somename,othername,col3,' |
sed -e 's/.*,name,//' -e s'/,$//'
somename,othername,col3
,name,
パターンの両側にあるカンマを参照してください。これは.*
、で終わる後続の名前を貪欲にキャプチャするのを防ぎます...name
。
答え2
ファイルの内容が次のようになるとします。
$ cat myfile
a,b,c,name,col1,col2,col3,forename,surname,name5,foo,name,name6
$
awk
解決策
$ awk -F',name,' '{print substr($0,index($0,$2))}' myfile
col1,col2,col3,forename,surname,name5,foo,name,name6
$
perl
解決策。
$ perl -pe 's/^.*?name,//' myfile
col1,col2,col3,forename,surname,name5,foo,name,name6
$