sed / awk / grep打印下一行

时间:2017-02-10 12:24:01

标签: bash shell awk sed

我有一个文件:

Bin674  chr04   32.003  32.09
Bin671  chr04   31.612  31.632

并提交b:

Bin670  Chr04   31.553  31.612
Bin671  Chr04   31.612  31.632
Bin672  Chr04   31.632  31.673
Bin673  Chr04   31.673  32.003
Bin674  Chr04   32.003  32.09
Bin675  Chr04   32.09   32.159
Bin676  Chr04   32.159  32.196

我想打印Bin673行和Bin675行以及Bin671行和Bin672行 只是,文件中的行是上一行和下一行: 怎么写shell?

3 个答案:

答案 0 :(得分:1)

嗯,这会给你你想要的东西。我把文件名称作为a和b。现在,读取文件a并获取第一个单词,然后打印文件b中匹配单词的上一行和下一行。

for word in $(< a awk '{split($0, word, " "); print word[1]}'); do out=$(grep "$word" -A1 -B1 b | grep -v "$word"); echo "$out"; done

答案 1 :(得分:0)

您可以使用grep Bin673 -A1 -B1 b

  • -An在匹配后显示n
  • -Bn在匹配前显示n

示例:

$ grep Bin673 -A1 -B1 b

Bin672  Chr04   31.632  31.673
Bin673  Chr04   31.673  32.003
Bin674  Chr04   32.003  32.09

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r 's:^(\S+\s).*:/\\n\1/{p;n;p}:' patternFile | sed -ne 'N' -f - dataFile

将花样文件转换为sed脚本,并在第二行使用两行匹配的窗口,然后打印以下行。