假设我有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
with;
并且我不能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 对一行执行的操作。