Awk:CSVから最初のいくつかのフィールドを削除する

Awk:CSVから最初のいくつかのフィールドを削除する

このコマンドを使用して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確認するテスト変数を追加します。name2番目のフィールドは、以前にtrue値に設定されている場合にのみ印刷し、p2番目のフィールドがあれば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
$

関連情報