我正在尝试不同的命令来处理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