что относительно чего-то вроде этого:
ls -ltr --group-directories-first
Если я правильно понимаю вашу проблему, то должно работать что-то подобное:
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
Другое решение perl
:
$ perl -MList::Util=any -nle '
BEGIN {
open $fh, "<", "input.txt";
@lines = <$fh>;
close $fh;
}
print if any { $_ == $. } @lines;
' file
Если предположить, что интерпретация 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
awk 'NR==FNR{linesToPrint[$0];next}
FNR in linesToPrint' line-numbers.txt file.txt
sed '/[^0-9]/d;s/.$/&p/' <input.txt |
sed -nf - file
Это два sed
s работающих вместе. Первая делает небольшую попытку убедиться, что она редактирует только соответствующие строки, отказываясь печатать любую строку, содержащую один нецифровой символ, и редактируя только строки, содержащие, по крайней мере, один символ. По сути, его задача состоит в том, чтобы преобразовать список номеров строк в:
2088p
2089p
2095p
2096p
Второй читает свой командный сценарий со стандартного входа и не печатает строки по умолчанию, поэтому все эти строки, отредактированные с помощью sed
, первая становится списком команд для sed
второй. Он выполняет эти команды в файле .
Очевидно, что подобная техника уже рекомендована, но существует принципиальная разница между аргументами вызова процесса и входными данными. В списках аргументов, таких как:
some_process $(seq a billion)
, есть определенные ограничения, но до тех пор, пока процесс знает, как с ним обращаться, его вход теоретически неограничен. Так, в данном случае sed
читает файл - |pipe
- как входной и обрабатывает его как скрипт sed
, что значительно отличается от передачи ему строки одинаковой длины в командной строке при вызове.
Объедините 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
.