awk中如何使用反斜杠("\")作为分隔符来拆分字符串?

3
我正在尝试根据某个分隔符拆分文件中的字符串。但我无法正确地实现它...以下是我的代码。
awk 'var=split($2,arr,'\'); {print $var}' file1.dat

大家好,这里是我的样本数据。

Col1 Col2
abc  123\abc
abcd 123\abcd

希望输出:

Col1 Col2
abc  abc
abcd abcd

3
你的引用有误,请仔细查看高亮部分。 - Lev Levitsky
仍然无法找到它... - Teja
1
你不能在单引号内嵌套单引号。 - glenn jackman
可能是文件中的列字符串编辑,bash sed awk的重复问题。 - glenn jackman
5个回答

7
您不需要调用split方法,只需使用\\作为字段分隔符即可:
echo 'a\b\c\d' | awk -F\\ '{printf("%s,%s,%s,%s\n", $1, $2, $3, $4)}'

输出:

a,b,c,d

echo 'a\b\c\d' | awk -F'\' '{printf("%s,%s,%s,%s\n", $1, $2, $3, $4)}' 也可以工作。 - gpojd
我执行了你的awk脚本,但它不起作用... 我得到了,d,,作为输出。 - Teja
我对以上内容仍然得到相同的输出。 - Teja
我在CentOS 5.5上也有GNU awk 3.1.3,当我输入我的答案中的命令时,我得到了a,b,c,d - anubhava

1

样本数据和输出是我对您需求的最佳猜测

 echo '1:2\\a\\b:3' | awk -F: '{ 
     n=split($2,arr,"\\")
     # print "#dbg:n=" n
     var=arr[3]
     print var
     }'

输出

b

请注意,split 函数返回它发现的字段数量。您可以取消注释调试行,然后看到返回值为 3。

还要注意,在我的测试中,我必须使用 2 个 '\' 字符才能被处理为 1 个字符。我认为您在文件中不需要这样做,但如果无法使用文件,则尝试根据需要添加额外的 '\' 到您的数据中。我尝试了几种 '\' 的用法变化,这似乎是最直接的方法。其他人可以评论!

希望这对您有所帮助。


即使awk脚本是在单独的文件中提供而不是在命令行上提供,您仍需要转义\ - dubiousjim

0
awk '{sub(/123\\/,"")}1' file

Col1 Col2
abc  abc
abcd abcd

0

你需要转义反斜杠,才能在其上进行分割。你可以在split中使用双引号进行转义,像这样:"\\"

此外,你可以使用数组切片使你的代码更易读(避免定义另一个变量)。这应该可以解决你的问题:

awk 'NR==1 { print } NR>=2 { split($0,array,"\\"); print $1,array[2] }' file1.dat

希望有所帮助。


0

正如一些评论所提到的,您有嵌套的单引号。将其中一个改为双引号应该可以解决问题。

awk 'var=split($2,arr,"\"); {print $var}' file1.dat

我更喜欢使用管道传输到另一个awk命令,而不是使用split。我不知道哪个比另一个更好,这只是一种偏好。

awk '{print $2}' file1.dat | awk -F'\' '{...}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接