Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash AWK字段分隔符中的管道符号|_Bash_Awk - Fatal编程技术网

Bash AWK字段分隔符中的管道符号|

Bash AWK字段分隔符中的管道符号|,bash,awk,Bash,Awk,我有一个文件foo,其中包含以下数据: A<|>B<|>C<|>D 1<|>2<|>3<|>4 它打印 A | B | C | D 1 | 2 | 3 | 4 这背后的原因是什么?Awk将分隔符读取为正则表达式“”。您必须转义管道字符(两次,看到诸如字段分隔符之类的动态regexp):“” 也可以将字段分隔符指定为参数: awk -F '<\\|>' '{out=""; for(i=1;i<=NF;i

我有一个文件
foo
,其中包含以下数据:

A<|>B<|>C<|>D
1<|>2<|>3<|>4
它打印

A | B | C | D 
1 | 2 | 3 | 4

这背后的原因是什么?

Awk将分隔符读取为正则表达式“
”。您必须转义管道字符(两次,看到诸如字段分隔符之类的动态regexp):
“”

也可以将字段分隔符指定为参数:

awk -F '<\\|>' '{out=""; for(i=1;i<=NF;i++){out=out" "$i}; print out}' <<< 'A<|>B<|>C<|>D'
 A B C D

awk-F''{out=”“;for(i=1;iBtw,这里也可以使用
sed

sed 's/<|>/ /g' file

管道是正则表达式中的一个特殊字符,因此需要使用反斜杠对其进行转义。但此反斜杠也是字符串文字的一个特殊字符,因此需要再次对其进行转义。因此,您将得到以下结果:

awk -F '<\\|>' '{$1=$1}1'

awk 'BEGIN {FS="<\\|>"} {$1=$1}1' 
awk-F''{$1=$1}1'
awk'BEGIN{FS=”“}{$1=$1}1'

这里很好地解释了这种语法的原因:。简言之,表达式被解析了两次。

只是一个提示:您可以使用
nr,而不是
nr,可以这样写:
awk'BEGIN{FS=”“}{$1=$1}1'
甚至
awk-F'{$1=$1}1'
@user000001为什么不把后一个放在答案中?我也想回答:)但是它应该是
awk-F''$1=$1'
我最初尝试过这个方法。取消对|的引用不能正常工作。它说下面的awk:warning:escape sequence
\\|被视为普通的
\|,我不太清楚understand@user000001公平点。但是你仍然需要
-F'
而不是
-F'
@Andrew原因是反斜杠“\”是字符串文字和正则表达式的特殊字符。因此需要对其进行双重转义。@EdMorton您指的是原始修订版,还是hek2mgl的编辑版?老实说,我只是在三个人要求后才发布了答案(参见对另一个答案的评论),但我不能删除它,因为它已被接受。进行了编辑以澄清这一点。但在我看来,这是一个有趣的问题。
sed 's/<|>/ /g' file
sed -n '1,10s/<|>/ /gp' file
awk -F '<\\|>' '{$1=$1}1'

awk 'BEGIN {FS="<\\|>"} {$1=$1}1'