次のコードがありますawk
。まず、ヘッダー行で目的のフィールド番号を決定し、次にそれらのフィールドの出力を出力します。問題は、目的のフィールド番号を保持するために連想配列を使用しているため、ループ内で ではfor
なくprint
を出力しているprintf
ことです。問題は、行末にも区切り記号が追加されることです。
これを回避する簡単な方法はありますか?例えば出力をもう一度実行して、追加の区切り文字を削除しますか? または、配列に格納されている番号のフィールドを出力するより良い方法はありますか?
awk '
BEGIN {
FS = ","; OFS = ","
no_headers = 2; headers[1] = "header1"; headers[2] = "header3"
k = 0
}
NR==1 {
for (i=1; i<=no_headers; i++) {
for (j=1; j<=NF; j++) {
s = gensub(/"/, "", "g", $j)
if (s==headers[i]) { col_no[++k] = j }
}
}
}
NR>1 {
for (i=1; i<=k; i++) { printf "%s,", $col_no[i] }
print ""
}' test_awk.txt
テストファイルは次のようになります
"header1","header2","header3","header4"
"a","b","c",4
1,"b",,"d"
"a","2","c","d"
そして私の現在の出力は次のようになります
"a","c",
1,,
"a","c",
でも、こんな感じにしたいです(つまり(末尾の区切り文字なし)
"a","c"
1,
"a","c"
答え1
ステートメントを変更して、書式指定子から をprintf()
削除し、 部分内に追加します。最後のフィールドにを追加しない場合は、三項演算子を使用します。,
{..}
,
printf "%s", (i==k) ? $col_no[i] : $col_no[i]","