假设我有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-33
为DEVICE-0001
. 由于我已经使用FS
过;
并且我不能FS
再次使用 as-
来拆分我的device
变量。我该如何处理awk
?FS
一旦已经被使用,如何使用特定字符拆分变量?
对于您的情况,使用
sub()
似乎就足够了。$3
您不想将, 也就是分配DEVICE-0001-33
给您的变量,而是要使用它的子字符串。假设那-
是里面的分隔符,你想删除最后一个字段。我们使用
-[^-]*$
以获取最后一个分隔符和最后一个字段。不仅-.*$
因为它很贪婪,而且会吃掉所有的田地,而且会吃掉第一个。替换是空字符串""
。并将结果写入该字段。所以你可以device = $3
用您问题标题的一般答案是使用该
split()
功能。它使您能够使用不同于FS
. 这个例子描述了它在做什么:你可以在这个字符串上做 awk 可以为一行做的事情。