如何与文本限定符一起使用cut命令

时间:2019-10-19 10:07:05

标签: linux bash powershell unix ksh

我有一个包含逗号分隔值的文本文件。 示例文件格式:

cat abc.txt
A,B,C,D

cat xyz.txt
A,"1,2,3",C,D

我想从这些文件中以逗号分隔第二列。

当我使用cut命令时,我得到以下输出:

cut -d',' -f2 abc.txt
B

这是正确的预期输出

cut -d',' -f2 xyz.txt
"1

这是不正确的。预期的输出为"1,2,3"1,2,3

有没有一种方法可以使用“”作为文本限定符从xyz.txt中删除第二列。这样“”中的逗号将被跳过?

3 个答案:

答案 0 :(得分:2)

您可以使用FPAT的{​​{1}}功能,请尝试以下操作。由于您使用的是gawk,所以我假设您也可以使用cut

awk

awk -v FPAT="([^,]+)|(\"[^\"]+\")" '{print $2}' Input_file 的现成变量中添加信息FPAT,如下所示:

  

FPAT:描述正则表达式中字段内容的正则表达式   一个记录。设置后,gawk将输入解析为字段,其中   字段匹配正则表达式,而不是使用   FS变量作为字段分隔符。

注意:按照@Walter A的警告,请注意此处使用此解决方案的第一个空白字段。

答案 1 :(得分:1)

您可以使用PowerShell和以下命令来实现:

Import-Csv -Path C:\Temp\abc.txt -Header H1, H2, H3, H4 |
  Select-Object -ExpandProperty H2

Import-Csv命令将以CSV格式导入文件,并添加一些随机标头(-Header H1, H2, H3, H4),因为该文件没有任何标头。之后,它将选择并展开第二列(Select-Object -ExpandProperty H2)。

答案 2 :(得分:0)

使用GNU sed 4.4可以实现

sed -r 's/(("[^"]*")|([^,]*)),(("[^"]*")|([^,]*)).*/\4/' xyz.txt

说明:
Option -r:避免需要反斜杠
("[^"]*",):用双引号引起来的字符串(还支持引号中的第一个字段,例如"A,a,a",B,C,D)。
([^,]*):如果找不到带引号的字段,请匹配直到下一个逗号。
(("[^"]*")|([^,]*)):以上述格式之一匹配一个字段。
,:在第一个字段和第二个字段之间只有一个,
(("[^"]*")|([^,]*)),(("[^"]*")|([^,]*)) :(第一字段)逗号(第二字段)
.*:匹配行的其余部分(不替换任何内容)
\4:第四场比赛