我有一个包含逗号分隔值的文本文件。 示例文件格式:
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中删除第二列。这样“”中的逗号将被跳过?
答案 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
:第四场比赛