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'