2014-01-22 6 views
0

У меня есть файл A с 400 000 строк. У меня есть другой файл B, в котором есть ряд строк.извлечь несколько строк файла unix

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

Я должен извлечь эти номера строки, указанные в файле B из файла А. То есть я хочу, чтобы извлечь строки 98,101,25012,10098,23489 из файла А. Как извлечь эти строки в следующих случаях.

  1. Файл B - это явный файл.
  2. Файл B поступает из трубы. Например, grep -n pattern somefile.txt дает мне файл B.

Я хотел использовать see -n 'x'p fileA. Однако я не знаю, как передать «x» из файла. Кроме того, я не могу передать значение «x» из команды.

ответ

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 ception:

$ 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

Вы имели в виду 's/$/p; /' right? также будет ли это работать, если в файлеB есть 30k строк? – Kent

+1

Когда я выполняю только этот $ (sed -e 's/$/p; /' B), он отображает каждое линейное число; в новой строке. Это 98; \ n101; \ n. Следовательно, когда я запускаю команду в целом, sed -e $ (sed -e 's/$ /; /' B) A, я получаю сообщение об ошибке «sed: 31494p ;: Нет такого файла или каталога». Я думаю, что первое sed с файлом B также должно удалить новую строку. –

+0

Извините, я не тестировал последнее утверждение. Исправленный. – l0b0

1

AWK подходит эту задачу лучше:

FiLea в случае файла:

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 
Смежные вопросы