【问题标题】:grep a substring in a column and print the rows that contain that substring in that columngrep 列中的子字符串并打印包含该列中子字符串的行
【发布时间】:2021-09-30 21:44:22
【问题描述】:

示例:

a,bee,a bee
c,fee,c dee
e,dee,e bee 
g,hee,d deen
h,aee,t Dee

如果上面的块是 3x5 数据,我想打印第三列中包含“dee”的行,它应该不区分大小写,只找到完全匹配的单词(例如“deen”是不可接受的),输出应该如下:

c,fee,c dee
h,aee,t Dee

Bash 命令是什么样子的

我尝试过的是:

awk -F"," '{print $3}' filename | grep -iw 'dee' 

但我仍然需要第 2 列的数据。

【问题讨论】:

  • 欢迎来到 Stack Overflow (SO)。 SO is a question and answer page for professional and enthusiast programmers。请在您的问题中添加您自己的代码。您应该至少展示自己为解决这个问题所做的研究。
  • grep -P "^([^,\n]+,){2}[^,\n]+dee$" file
  • 如果这是一个 3x3 表格,是否意味着您的分隔符是逗号 , 例如第一行有元素“a”、“bee”和“a bee”(最后一列有空格)?
  • 正确,","是分隔符
  • 这是您要找的吗? stackoverflow.com/a/17001897/1581658(添加了一些 toLower 以忽略大小写)

标签: bash


【解决方案1】:

假设您的数据在一个名为 dat 的文件中,试试这个:

sed -ne '/[dD]ee$/p' dat

或者如果你喜欢使用awk:

awk '/[dD]ee$/' dat

或者如果你喜欢使用grep:

grep -i 'dee$' dat

那么输出是

c,fee,c dee
h,aee,t Dee

尝试探索如何使用正则表达式匹配一个模式。 在您的情况下,您的正则表达式是 [dD]ee$ 匹配模式 deeDee 在任何行的末尾 $

【讨论】:

  • 我试过了但是输出只有'h,aee,t Dee'
【解决方案2】:

参考https://www.gnu.org/software/gawk/manual/html_node/Regexp.html

$: awk -F, 'BEGIN{IGNORECASE=1} $3~/\<dee\>/' file # \< & \> are word boundaries
c,fee,c dee
h,aee,t Dee

或者只是grep -

$: grep -Ei '([^,]+,){2}.*\<dee\>' file # constrain string to 3rd field
c,fee,c dee
h,aee,t Dee

【讨论】:

  • 两种方法都有效!谢谢你。但我可能必须先弄清楚如何使用正则表达式来处理我的真实数据。不过还是谢谢。
  • 发布问题时请注意XY Problem。始终尝试使用尽可能接近真实的数据。如果您用示例更新您的问题,我们可能会提供帮助。
猜你喜欢
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 2017-11-17
  • 2014-12-26
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多