【问题标题】:how to print a line resulting from a search keyword in a column using grep command,如何使用 grep 命令在列中打印由搜索关键字产生的行,
【发布时间】:2015-01-11 10:26:49
【问题描述】:

这是一个 filename.csv 文件的示例

"Sort Order","Common Name","Formal Name","Type","Sub Type"

"1","Afghanistan","Islamic State of Afghanistan","Independent State"    
"2","Albania","Republic of Albania","Independent State"    
"3","Algeria","People's Democratic Republic of Algeria","Independent State"    
"4","Andorra","Principality of Andorra","Independent State"    
"5","Angola","Republic of Angola","Independent State"

那么什么是 grep 命令以通用名称搜索 angola 并打印如下:

"5","Angola","Republic of Angola","Independent State"

我知道我们可以使用:

grep '"Algeria"' filename.csv

但是,如果我说得更具体一些。假设 Algeria 可能存在于其他列中,但是我们只需要在 Common Name 列中打印一个。

我试过了

grep '"Common Name | Algeria"' filename.csv

似乎不起作用。

【问题讨论】:

    标签: linux bash unix csv grep


    【解决方案1】:

    您可以尝试下面的 grep 命令来打印第二列中包含字符串 Angola 的行。

    grep -E '^"[^"]*","Angola"' file
    

    这可以通过 awk 轻松完成,

    awk -F, '$2=="\"Angola\""' file
    

    【讨论】:

    • 不,必须是 $2~/^"Angola"$/== 将进行精确的字符串匹配,那么需要什么正则表达式。我们不要忘记包含锚。
    • 这是更正确的命令,否则$2~/Angola/ 也将匹配Angolans
    【解决方案2】:

    试试awk

    awk -F"," '$2~/Algeria/' file

    【讨论】:

      【解决方案3】:

      使用cut 命令,

       grep Algeria filename.csv|cut -f2 -d','|awk -F '[""]' '{print $2}'
      

      输出:

      Algeria
      

      这是我在您的grep 中添加的所有命令的解释,并丢弃了您在其中使用的一些不必要的引号。

      cut 命令:

      -f 它将根据分隔符提取第二列

      -d 它将选择分隔符,即:这里是,

      awk 命令:

      它将提取两个""(块引号)之间的值并打印出来。

      【讨论】:

      • Algeria,如果出现在一行中,则始终是第二个字段,根据数据。所以整个管道实际上与echo Algeria 相同;-) OP 想要打印整行,其中"Algeria" 作为第二个字段...
      • @anishsane 抱歉,我误解了这个问题。
      猜你喜欢
      • 2015-01-01
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多