提取文件unix的多行

时间:2014-01-22 22:38:15

标签: shell unix command-line

我有一个包含400,000行的文件A.我有另一个文件B有一堆行号。

File B:  
-------
98  
101
25012
10098
23489

我必须从文件A中提取文件B中指定的那些行号。我想从文件A中提取行98,101,25012,10098,23489。如果在以下情况下提取这些行。

  1. 文件B是显式文件。
  2. 文件B从管道到达。例如,grep -n pattern somefile.txt给我文件B.
  3. 我想使用see -n'x'p fileA。但是,我不知道如何从文件中提供'x'。另外,我不知道如何从命令中管道'x'的值。

2 个答案:

答案 0 :(得分:1)

sed可以打印您想要的行号:

$ printf $'foo\nbar\nbaz\n' | sed -ne '2p'
bar

如果你想要多行:

$ printf $'foo\nbar\nbaz\n' | sed -ne '2p;3p'
bar
baz

要将一组行转换为sed这样的命令,请使用sed获取漂亮的sed版本:

$ printf $'98\n101' | sed -e 's/$/;/'
98;
101;

全部放在一起:

sed -ne "$(sed -e 's/$/p;/' B)" A

测试:

$ cat A
1
22
333
4444
$ cat B
1
3
$ sed -ne "$(sed -e 's/$/p;/' B)" A
1
333

QED。

答案 1 :(得分:1)

awk更适合这项任务:

fileA in file case:

awk 'NR==FNR{a[$0]=1;next}a[FNR]' fileB fileA

fileA来自管道的内容:

cat fileA|awk 'NR==FNR{a[$0]=1;next}a[FNR]' fileB -

哦,你想要FileB在文件中或来自管道,然后是同样的awk cmd:

awk '...' fileB fileA

cat fileB|awk '...' - fileA