当 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

问题是我想将字符串拆分DEVICE-0001-33DEVICE-0001.因为我已经使用了FSwith;并且我不能FS再次使用 as-来分割我的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 对一行执行的操作。

相关内容