Linux 双引号内逗号分隔的值
我有一个用逗号分隔的数据文件,数据用Linux 双引号内逗号分隔的值,linux,unix,awk,Linux,Unix,Awk,我有一个用逗号分隔的数据文件,数据用“”括起来: 我想获取要分配给变量的第三列值(0001) 我试过了 FILE_VER=`cat file.txt | awk -F',' '{if ($1 == "HD") print $3}'` 我没有为文件\u VER分配任何值。请帮助我了解正确的语法。您可以将文件更改为将逗号和引号替换为选项卡: tr -s '\"," "\t' < filename | awk '{print $3}' tr-s'\',“\t'
“
”括起来:
我想获取要分配给变量的第三列值(0001
)
我试过了
FILE_VER=`cat file.txt | awk -F',' '{if ($1 == "HD") print $3}'`
我没有为
文件\u VER
分配任何值。请帮助我了解正确的语法。您可以将文件更改为将逗号和引号替换为选项卡:
tr -s '\"," "\t' < filename | awk '{print $3}'
tr-s'\',“\t'
也许有一种只使用awk的解决方案,但这很好!您就快到了。只需删除引号就足够了:
foo=$(awk -F, '$1=="\"HD\""{gsub(/"/,"",$3);print $3}' file)
不确定这是否是最佳的方式,但有效:
FILE_VER=$(awk -F',' '$1 == "\"HD\"" {gsub("\"","",$3); print $3}' file.txt)
HD
另一个
awk
版本:
awk -F'"' '$2 == "HD"{print $6}' file
祝贺您赢得了!(仅列举您的答案中的一个问题)我想@hek2mgl同时回答了!=PYes,我现在你不需要使用cat…只是我习惯了…实际上我的前3个命令可以只是一个…我正在改变这一点。但是我认为awk的答案就是他想要的!现在看起来好多了,但是
tr
命令仍然不能正常工作。我想你想要tr-d'
这很危险。当csv包含类似于“foo\”bar“
的字段时,它将立即中断。这里的分隔符是,
,应该使用该分隔符。@hek2mgl是的,我将中断,但删除所有“
也会中断,因为数据不完整。不过,这两个问题在这里可能都不是问题。如果你想确定并满足边缘情况,那么就应该使用真正的csv解析器。它工作正常,但不知道什么时候会崩溃。正如AndrlRC指出的那样,为了公平起见,我选择了hek2mglTo的方案,我的解决方案与此一样稳定。只有在数据字段本身不能包含双引号的情况下,这两种方法才有效。您能否澄清您的预期输出?您说的是0001
,但您尝试的awk脚本会给出“0001”
。。。您必须在比较时包含引号awk-F',“{if($1==“\'HD\”)print$3}”file.txt
或匹配部分字符串,awk-F',“{if($1~/HD/)print$3}”file.txt
感谢hek2mgl和@Jean François Fabre
awk -F'"' '$2 == "HD"{print $6}' file