Выделение нескольких строк из файла одновременно

bash awk

84 просмотра

4 ответа

Не уверен, что это возможно, но здесь идет

У меня есть список номеров.

cat list

Выход-

1
22
53
75

И у меня есть вторичный файл с 500 строками (file.txt). Я хочу выделить 1, 22, 53 и 75 строки из этого файла.

То, что я сейчас попробовал, это

for i in `cat list`; do awk "NR==$i" file.txt ; done

Это работает, но на самом деле ДЕЙСТВИТЕЛЬНО медленно (мои настоящие файлы содержат более 50 тысяч строк). Мне было интересно, есть ли более эффективное решение. Может быть, способ прочитать список и вывести все эти строки в одном процессе, а не 4 процесса.

Автор: Chem-man17 Источник Размещён: 08.11.2019 11:13

Ответы (4)


5 плюса

Решение

Допустим, список содержит эти строки:

$ cat list
1
22
53
75

подход на основе sed + bash:

$ a=($(<list))
# ^^ a will contain contents of 'list' in individual array elements.
$ sed -n "${a[*]/%/p;}" file.txt
# ^^ "${a[*]/%/p;}" will expand to "1p;22p;53p;75p;"

подход на основе awk:

$ awk 'NR==FNR{a[$0]++; next;} (FNR in a)' list file.txt
# Array 'a' will contain 1 at indices equal to lines in 'list'
# Then match line numbers for second file, which are indices of 'a'
Автор: anishsane Размещён: 20.08.2016 11:44

1 плюс

С GNU sed и GNU bash:

sed -n -f <(sed 's/.*/&p/' numbers.txt) file.txt
Автор: Cyrus Размещён: 20.08.2016 11:49

0 плюса

вот еще один awk, если ваш список очень маленький

awk -v nums="^($(paste -s -d"|" list))$" 'NR~nums' file
Автор: karakfa Размещён: 21.08.2016 01:21

-1 плюса

Вы можете использовать headи tailдля этого.

Usng head вернет первые n строк файла, tail вернет последние n строк, поэтому, если я хочу получить строку 5:

cat file | head -n 5 | tail -n 1

Должен сделать свое дело.

ETA - вероятно, стоит указать, что вы не можете передать 0 в качестве параметра опции .n, строки пронумерованы от 1 и выше, а не от 0 и выше.

Надеюсь, это полезно.

Автор: Nunchy Размещён: 20.08.2016 11:34
Вопросы из категории :
32x32