当 FS 已在使用时,如何使用 awk 分割字符串?

ray*_*ght 1 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
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-33DEVICE-0001. 因为我已经使用了FSwith;并且我不能FS再次使用 as-来分割我的device变量。我怎样才能仅使用来处理这个问题awkFS一旦已经使用,如何将变量与特定字符分开?

tha*_*isp 6

对于你的情况,使用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 对一行执行的操作。