使用竖线字符作为字段分隔符



我正在尝试不同的命令来处理csv文件,其中分隔符是管道|字符。

虽然当逗号是分隔符时这些命令确实有效,但当我用管道替换它时它会引发错误:

awk -F[|] "NR==FNR{a[$2]=$0;next}$2 in a{ print a[$2] [|] $4 [|] $5 }" OFS=[|] file1.csv file2.csv
awk "{print NR "|" $0}" file1.csv

我试过,"|"[|]/|无济于事。

我在窗户上使用Gawk。我错过了什么?

你试过"|"[|]/|/|不起作用,因为转义字符是 ,而 [] 用于定义一系列字段,例如[,-]如果您希望FS,还是-

为了使它正常工作"|"很好,您确定您以这种方式使用它吗?或者,转义它 --> |

$ echo "he|llo|how are|you" | awk -F"|" '{print $1}'
he
$ echo "he|llo|how are|you" | awk -F| '{print $1}'
he
$ echo "he|llo|how are|you" | awk 'BEGIN{FS="|"} {print $1}'
he

但请注意,当你说:

print a[$2] [|] $4 [|] $5

所以你根本没有使用任何分隔符。正如您已经定义OFS ,执行以下操作:

print a[$2], $4, $5

例:

$ cat a
he|llo|how are|you
$ awk 'BEGIN {FS=OFS="|"} {print $1, $3}' a
he|how are

对于多年后发现这一点的人: 总是引用外壳元字符!

我认为gawk(GNU awk(特别对待|,所以应该引用(awk(。OP对[|]有这个权利。然而[|]也是一个贝壳图案。至少在bash,只有它与当前工作目录中的文件匹配时,才会扩展:

$ cd /tmp
$ echo -F[|]    # Same command
-F[|]
$ touch -- '-F|'
$ echo -F[|]    # Different output
-F|
$ echo '-F[|]'  # Good quoting
-F[|]           # Consistent output

所以它应该是:

awk '-F[|]'
# or
awk -F '[|]'

awk -F "[|]"也可以,但 IMO,只有在您有实际扩展的内容时才使用软引号 ( " (,或者字符串本身包含硬引号 ( ' (,不能以任何方式嵌套(。

请注意,如果这些字符位于不带引号的变量中,也会发生同样的事情。

如果文本变量包含或可能包含:[]?*,引用它或set -f关闭路径名扩展(我认为,单个不匹配的方括号在技术上是可以的(。

如果变量包含或可能包含 IFS 字符(默认情况下为空格、制表符、换行符(,请用引号括起来(除非您希望拆分它(。或者首先export IFS=(承担后果(,如果引用是不可能的(例如,一个疯狂的eval(。

注意:无论 IFS 如何,原始文本始终按空格分隔。

尝试逃离|

echo "more|data"  | awk -F| '{print $1}'
more
您可以

转义| |

$ cat test
hello|world
$ awk -F| '{print $1, $2}' test
hello world

最新更新