如何在 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 的分隔符

如何使用分隔符数组在 Java 中使用多个分隔符拆分字符串? [复制]

是否有像 C++ 中那样带有分隔符的 C# 原始字符串?

如何在python中拆分具有多个分隔符的字符串? [复制]