假设我有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
Run Code Online (Sandbox Code Playgroud)
我创建了一个awk
脚本,用于在设备名称出现在我的文件中时处理获取设备名称,然后完成执行。它script.awk
的功能如下:
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
Run Code Online (Sandbox Code Playgroud)
其执行后的输出awk -f script.awk file.csv
为:
filename;folder
DEVICE-0001-33_118574934-20220503-17h44m20s101.txt;DEVICE-0001-33
Run Code Online (Sandbox Code Playgroud)
问题是我想将字符串拆分DEVICE-0001-33
为DEVICE-0001
. 因为我已经使用了FS
with;
并且我不能FS
再次使用 as-
来分割我的device
变量。我怎样才能仅使用来处理这个问题awk
?FS
一旦已经使用,如何将变量与特定字符分开?
对于你的情况,使用sub()
似乎就足够了。您不想将$3
,即DEVICE-0001-33
,分配给变量,而是使用它的子字符串。假设这-
是里面的分隔符,您想要删除最后一个字段。
echo "DEVICE-0001-33" | awk '{sub(/-[^-]*$/,"",$1); print}'
DEVICE-0001
Run Code Online (Sandbox Code Playgroud)
我们使用-[^-]*$
来获取最后一个分隔符和最后一个字段。不仅仅是-.*$
因为它很贪婪,会吃掉所有田地,除了第一个田地。替换是空字符串""
。并将结果写入该字段。所以你可以替换device = $3
为
sub(/-[^-]*$/,"",$3); device = $3
Run Code Online (Sandbox Code Playgroud)
您的问题标题的一般答案是使用该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
Run Code Online (Sandbox Code Playgroud)
您可以对该字符串执行 awk 对一行执行的操作。