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-0001
FS
;
FS
-
device
awk
FS
ベストアンサー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が行に対して実行する操作を文字列で実行できます。