чтение списка строк от вывода записи файла до утилиты

что относительно чего-то вроде этого:

ls -ltr --group-directories-first
4
24.07.2014, 02:36
6 ответов

Если я правильно понимаю вашу проблему, то должно работать что-то подобное:

for i in $(cat numbers.txt); do cat lines.txt|tail -n +$i|head -n 1; done

Для каждого из чисел в файле "numbers.txt" он извлекает соответствующую строку из другого файла и распечатывает ее.

То же самое с sed и xargs выглядит следующим образом:

xargs -i sed "{}q;d" lines.txt <numbers.txt
1
27.01.2020, 20:58

Другое решение perl :

$ perl -MList::Util=any -nle '
    BEGIN {
        open $fh, "<", "input.txt";
        @lines = <$fh>;
        close $fh;
    }
    print if any { $_ == $. } @lines;
' file
0
27.01.2020, 20:58

Если предположить, что интерпретация michas верна, то вот решение awk:

awk 'FNR==NR{a[i++]=$0} # Process the first file
     FNR!=NR{           # Process the second file
         for (i in a){
             if(FNR==a[i]){
                 print $0
             }
         }
     }' file_with_line_numbers other_file

В Perl:

perl -E '
    while(<>){
        chomp;
        if($file2) { say if exists $lines{$.} }
        else       { $lines{$_}++             }
    }   continue   { if (eof){$.=0; $file2++} }'\
    file_with_line_numbers other_file
1
27.01.2020, 20:58
awk 'NR==FNR{linesToPrint[$0];next}
     FNR in linesToPrint' line-numbers.txt file.txt
1
27.01.2020, 20:58
sed '/[^0-9]/d;s/.$/&p/' <input.txt |
sed -nf - file

Это два seds работающих вместе. Первая делает небольшую попытку убедиться, что она редактирует только соответствующие строки, отказываясь печатать любую строку, содержащую один нецифровой символ, и редактируя только строки, содержащие, по крайней мере, один символ. По сути, его задача состоит в том, чтобы преобразовать список номеров строк в:

2088p
2089p
2095p
2096p

Второй читает свой командный сценарий со стандартного входа и не печатает строки по умолчанию, поэтому все эти строки, отредактированные с помощью sed, первая становится списком команд для sed второй. Он выполняет эти команды в файле .

Очевидно, что подобная техника уже рекомендована, но существует принципиальная разница между аргументами вызова процесса и входными данными. В списках аргументов, таких как:

some_process $(seq a billion)

, есть определенные ограничения, но до тех пор, пока процесс знает, как с ним обращаться, его вход теоретически неограничен. Так, в данном случае sed читает файл - |pipe - как входной и обрабатывает его как скрипт sed, что значительно отличается от передачи ему строки одинаковой длины в командной строке при вызове.

0
27.01.2020, 20:58

Объедините sed с xargs и printf :

sed -n $(xargs printf "%sp;" < input.txt) data

-n сообщает sed не печатать строки, если вы сказать это явно. xargs запускает команду со строками из стандартного ввода в качестве аргументов. printf отформатирует каждый аргумент, как описано. $ (...) выше расширяется до (для вашего образца файла):

2088p;2089p;2095p;2096p;

, который представляет собой последовательность команд sed , сообщающих ему напечатать строки 2088, 2089, 2095, и 2096.

Таким образом, вы читаете каждый файл один раз, а не много раз для xargs -i sed "{} q" или piped head и tail .

0
27.01.2020, 20:58

Теги

Похожие вопросы