如何在 Unix 中使用带有多个字符分隔符的 cut?
Posted
技术标签:
【中文标题】如何在 Unix 中使用带有多个字符分隔符的 cut?【英文标题】:How to use cut with multiple character delimiter in Unix? 【发布时间】:2014-10-16 07:49:20 【问题描述】:我的文件是这样的
abc ||| xyz ||| foo bar
hello world ||| spam ham jam ||| blah blah
我想提取一个特定的列,例如我本来可以做到的:
sed 's/\s|||\s/\\t/g' file | cut -f1
但是还有其他方法吗?
【问题讨论】:
这是您要找的吗? How to make the 'cut' command treat several sequential delimiters as one? 【参考方案1】:由于|
是一个有效的正则表达式,它需要用\\|
转义或放在方括号中:[|]
。
你可以这样做:
awk -F' \\|\\|\\| ' 'print $1' file
其他一些同样有效的变体:
awk -F' [|][|][|] ' 'print "$1"' file
awk -F' [|]3 ' 'print "$1"' file
awk -F' \\|3 ' 'print "$1"' file
awk -F' \\|+ ' 'print "$1"' file
awk -F' [|]+ ' 'print "$1"' file
\
作为分隔符在方括号中效果不佳,只能转义,还有很多转义字符 :)
cat file
abc \\\ xyz \\\ foo bar
示例:表达式中每个 \
对应 4 个 \
,因此总共有 12 个 \
。
awk -F' \\\\\\\\\\\\ ' 'print $2' file
xyz
或
awk -F' \\\\3 ' 'print $2' file
xyz
或者这个,但它并不简单
awk -F' [\\\\]3 ' 'print $2' file
xyz
awk -F' [\\\\][\\\\][\\\\] ' 'print $2' file
xyz
【讨论】:
或者只是print $1
?
一个解释它是如何工作的分解会很好。特别是最好指定需要更改的是 $1
以获得不同的列。
$0
包含整行,因此$0=$1
用第一个字段替换该行。
之后的 1
(任何计算结果为 true 的内容)会导致打印该行。
我不得不做awk -F ' \\|\\|\\| ' 'print $1'
【参考方案2】:
你可以使用 awk 来做 -
$ awk 'BEGIN FS=" \|\|\| ";print $1' file
将 $1 替换为 $2、$3 等。
【讨论】:
运行这个命令,你会得到:awk: cmd. line:1: warning: escape sequence
\|'被视为普通的`|'以上是关于如何在 Unix 中使用带有多个字符分隔符的 cut?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 RegExp 中由 OR 运算符分隔的多个单词中首先匹配更大的单词?使用 java 脚本
如何基于多个空格字符将文本文件拆分为 2 列作为 scala spark 的分隔符