繁体   English   中英

如何使用剪切命令和文本限定符

[英]How to use cut command along with text qualifier

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

cat abc.txt
A,B,C,D

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

我想从这些用逗号分隔的文件中删除第二列。

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

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

这是正确和预期的 output

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

这是不正确的。 预期的 output 是"1,2,3"1,2,3

有没有办法我们可以使用“”作为文本限定符从 xyz.txt 中删除第二列。 那么“”中的逗号会被跳过吗?

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

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

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

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

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

您可以使用 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 并展开第二列( Select-Object -ExpandProperty H2 )。

使用 GNU sed 4.4 这个工程

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM