获取一定数量的行

时间:2012-01-12 13:53:28

标签: linux sed awk

我需要以下帮助:我有这种名为file-1

的文件
1
++++++^^++++
++++++++++++
+++++++++^^^
^^++++++++++

2
++++++++++++
^^^+++++^^^^
^^^^^^^+++++
+++++^^^++^+

现在,我想打印出起始编号与另一个名为file-2的文件相同的部分。 我们假设file-2包含1值,因此我需要获得此输出:

1
++++++^^++++
++++++++++++
+++++++++^^^
^^++++++++++

有人可以给我一些建议吗?

3 个答案:

答案 0 :(得分:4)

$ awk -v RS='' 'NR==FNR{split($0, a, /\n/); next}; $1 in a' file-{2,1}
1
++++++^^++++
++++++++++++
+++++++++^^^
^^++++++++++

file-2逐行包含索引:

1
3
5

阐释:

  • RS='' 告诉awk阅读多行记录
  • NR==FNR file-2视为一行,因此我们应split \n,并将结果保存在数组{{1}中}
  • a 跳过休息命令,准备阅读next
  • file-1 测试$1 in a列表中的第一列file-1
  • a 我们应首先阅读file-{2,1}以获取所有索引

答案 1 :(得分:0)

这可能对您有用:

sed 's|.*|/^&$/,/^$/p|' file2 | sed -nf - file1
1
++++++^^++++
++++++++++++
+++++++++^^^
^^++++++++++

答案 2 :(得分:0)

使用GNU-awk,你可以试试这样的东西 -

gawk 'NR==FNR {for (i=1;i<=NF;i++) a[$i];next} ($1 in a)' RS='\n\n' file-{2,1}
  

说明:

     
      
  1. 我们使用内置的RS变量将记录分隔符设置为\n\n
  2.   
  3. 我们使用for循环并将值存储在数组中的file-2中。这将标识您要从file-1提取的记录。
  4.   
  5. 我们会检查file-1的第一列。如果它存在于数组中,我们打印该记录。不,我们不。
  6.   

测试:

[jaypal:~/Temp] cat file-1
1
++++++^^++++
++++++++++++
+++++++++^^^
^^++++++++++

2
++++++++++++
^^^+++++^^^^
^^^^^^^+++++
+++++^^^++^+

[jaypal:~/Temp] cat file-2
1
3
4

[jaypal:~/Temp] gawk 'NR==FNR {for (i=1;i<=NF;i++) a[$i];next} ($1 in a)' RS='\n\n' file-{2,1}
1
++++++^^++++
++++++++++++
+++++++++^^^
^^++++++++++