FSがすでに使用されているときにawkを使用して文字列を分割する方法は?

FSがすでに使用されているときにawkを使用して文字列を分割する方法は?

file.csv以下があるとしましょう。

id;filename;device
1;118574934-20220503-17h44m20s101;
2;118574934-20220503-17h44m20s101;
3;118574934-20220503-17h44m20s101;DEVICE-0001-33
4;118574934-20220503-17h44m20s101;DEVICE-0001-33
5;118574934-20220503-17h44m20s101;DEVICE-0001-33
6;118574934-20220503-17h44m20s101;DEVICE-0001-33
7;118574934-20220503-17h44m20s101;DEVICE-0001-33

awk私のファイルにデバイス名が表示されたら、デバイス名を取得して実行を完了するスクリプトを作成しました。そのscript.awk機能は次のとおりです。

BEGIN {
    FS=";"
}
NR > 1 { fileName = $2 }
NR > 1 { if ( $3 != "" ) { device = $3; exit} }
END {
    if ( device == "" ) {
        line = "UNCONNECTED_"fileName".txt;UNCONNECTED"
    } else {
        line = device"_"fileName".txt;"device
    }
    print "filename;folder"
    print line
}

実行後の出力は次awk -f script.awk file.csvのようになります。

filename;folder
DEVICE-0001-33_118574934-20220503-17h44m20s101.txt;DEVICE-0001-33

問題はすでにwithを使用しており、asを再利用して変数を分割できないため、文字列をDEVICE-0001-33。のみ使用してこの問題をどのように処理できますか?変数を使用した後、特定の文字と変数をどのように分離できますか?DEVICE-0001FS;FS-deviceawkFS

ベストアンサー1

あなたの場合は、sub()使用するのに十分なようです。$3つまりDEVICE-0001-33、 を変数に代入したくない場合は、その変数の部分文字列を使用してください。これが-内部区切り文字であると仮定すると、最後のフィールドを削除しようとします。

echo "DEVICE-0001-33" | awk '{sub(/-[^-]*$/,"",$1); print}'

DEVICE-0001

最後の-[^-]*$区切り記号と最後のフィールドを取得するために使用します。-.*$欲が多いので、最初の畑だけを除いてすべて食べるからだけではありません。置換は空の文字列です""。そしてその結果をこのフィールドに書き込みます。だからあなたdevice = $3

sub(/-[^-]*$/,"",$3); device = $3

あなたの質問のタイトルに対する一般的な答えは、このsplit()機能を使用することです。と異なるものを使用できますFS。この例では、実行される操作について説明します。

echo "DEVICE-0001-33" | awk -v s='-' '{
    n=split($1,arr,s)
    print "number of fields: " n
    print "separator: " s
    for (i=1;i<=n;i++) print "field: " i " value: " arr[i]
}'

number of fields: 3
separator: -
field: 1 value: DEVICE
field: 2 value: 0001
field: 3 value: 33

awkが行に対して実行する操作を文字列で実行できます。

おすすめ記事