【问题标题】:How to use cut command along with text qualifier如何使用剪切命令和文本限定符
【发布时间】:2020-02-16 03:24:54
【问题描述】:

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

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 中删除第二列。那么“”中的逗号会被跳过吗?

【问题讨论】:

  • cut 命令不支持字段可以嵌入逗号的重要 CSV 格式。您需要使用不同的工具,例如 Python 将是一个不错的选择。此外,在您的问题的上下文中,将bashkshpowershell 一起包含是没有意义的

标签: linux bash powershell unix ksh


【解决方案1】:

您可以使用gawkFPAT 功能,请尝试关注。由于您使用的是cut,我假设您也可以使用awk

awk -v FPAT="([^,]+)|(\"[^\"]+\")" '{print $2}'  Input_file

man awk添加信息FPAT开箱即用变量如下:

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

注意:根据@Walter A 在 cmets 中的警告,请注意此解决方案的第一个空字段。

【讨论】:

  • @PS,您能否检查一下我的解决方案,如果这对您有帮助,请告诉我?
  • 堡垒字段为空,您将获得字段 3。试试echo ',"1,2,3",C,D'
  • @WalterA,老实说,我仅使用当前样本编写和测试了它,并没有假设这种情况。如果可能的话,您可以删除投票请求您将其删除,因为代码适用于给定的示例。我将尝试编辑此解决方案。
  • 我试图删除反对票,但我不能。我收到消息,除非您的答案被编辑,否则我的反对票已被锁定。
  • 我删除了反对票,但您可以添加关于第一个字段为空的警告。
【解决方案2】:

您可以使用 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)。

【讨论】:

    【解决方案3】:

    使用 GNU sed 4.4 可以正常工作

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

    说明:
    Option -r:避免需要反斜杠
    ("[^"]*",):双引号中的字符串(也支持引号中的第一个字段,如"A,a,a",B,C,D)。
    ([^,]*):当没有引号时找到字段,匹配到下一个逗号。
    (("[^"]*")|([^,]*)):匹配上述格式之一的字段。
    ,:在第一个和第二个字段之间只有一个,
    @987654329 @:(第一个字段)逗号(第二个字段)
    .*:匹配行的剩余部分(替换为空)
    \4:第4个记住的匹配

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 2015-01-08
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多