grep:保留某些列中具有特定字符串的行

时间:2014-10-01 18:54:58

标签: awk sed grep

我正在尝试挑选某些列中具有特定值的行并将其保存到输出中。我试图用grep这样做。可能吗?

我的数据如下所示:

apple   5   abcdefd  ewdsf
peach   5   ewtdsfe  wtesdf
melon   1   ewtedf   wersdf
orange  3   qqqwetr  hredfg

我想在第二列中选出值为5的行并将其保存到新的outputfile。

apple   5   abcdefd  ewdsf
peach   5   ewtdsfe  wtesdf

我很感激你的帮助!

5 个答案:

答案 0 :(得分:7)

可能grep可能,但执行此操作的适当工具肯定是awk。您可以使用

过滤第二列上每行5的行
awk '$2 == 5'

说明

awk将其输入分为记录(通常是一行)和字段(通常是一列),并对符合特定条件的记录执行操作。这里

awk '$2 == 5'

的缩写
awk '$2 == 5 {print($0)}'

转换为

For each record, if the second field ($2) is 5, print the full record ($0).

变体形式

如果您需要动态选择用于过滤值的键值,请使用-v的{​​{1}}选项:

awk

如果您需要保留文件的第一行,因为它包含表的标题,请使用跟踪当前记录的序号的awk -v "key=5" '$2 == key {print($0)}' 变量:

NR

字段分隔符是一个正则表达式,用于定义哪些文本分隔列,可以使用awk 'NR == 1 || $2 == 5' 字段进行修改。例如,如果您的数据位于基本CSV文件中,则过滤器将为

-F

访问代码维基,找到一些有用的信息,以便开始学习awk -F", *" '$2 == 5'

答案 1 :(得分:4)

要在第二个字段5使用时打印:awk '$2==5' file

答案 2 :(得分:0)

尝试一下:

grep '^[^\s]\+\s5.*$' file.txt

模式查找行的开头,后跟多个非空格字符,后跟空格,后跟5,后跟任意数量的字符,然后是eol。

答案 3 :(得分:0)

您可以获得以下命令。

$ cat data.txt
apple   5   abcdefd  ewdsf
peach   5   ewtdsfe  wtesdf
melon   1   ewtedf   wersdf
orange  3   qqqwetr  hredfg
grape   55  kkkkkkk  aaaaaa

$ grep -E '[^ ]+ +5 .*' data.txt > output.txt

$ cat output.txt
apple   5   abcdefd  ewdsf
peach   5   ewtdsfe  wtesdf

您只能使用grep命令获得答案。 但我强烈建议您使用awk命令。

答案 4 :(得分:-2)

这样做的简单方法是:

grep '5' MyDataFile

结果:

apple   5   abcdefd  ewdsf
peach   5   ewtdsfe  wtesdf

要在新文件中捕获它:

grep '5' MyDataFile > newfile

注意:会在MyDataFile中找到5个任意位置。要限制到第二列,可以使用简短的脚本来满足您的需求。如果您只想将它​​限制在第二列,那么像下面这样的快速脚本就可以了。用法:script number datafile

#!/bin/bash

while read -r fruit num stuff || [ -n "$stuff" ]; do
    [ "$num" -eq "$1" ] && printf "%s  %s  %s\n" "$fruit" "$num" "$stuff"
done <"$2"

<强>输出:

$ ./fruit.sh 5 dat/mydata.dat

apple  5  abcdefd  ewdsf
peach  5  ewtdsfe  wtesdf