Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 双引号内逗号分隔的值_Linux_Unix_Awk - Fatal编程技术网

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