根据行号列表从文件中读取行并将输出写入实用程序

根据行号列表从文件中读取行并将输出写入实用程序

我有一个文件,其中包含我想从另一个文件读取的行列表。我想将这些行输出到一个实用程序 ( grep),它可以让我读取整行并从中提取信息。包含这些行的文件如下所示:

cat input.txt
2088
2089
2095
2096

由于某种原因,我被困在这个问题上。我知道sed可以将特定的行号作为参数,但我不知道如何将其放入变量中以提供给它。

答案1

awk 'NR==FNR{linesToPrint[$0];next}
     FNR in linesToPrint' line-numbers.txt file.txt

答案2

如果我正确理解你的问题,这样的事情应该有效:

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

对于文件“numbers.txt”中的每个数字,它提取另一个文件的相应行并打印它。

和 是一样的sedxargs看起来像这样:

xargs -i sed "{}q;d" lines.txt <numbers.txt

答案3

假设米查斯的解读是正确的,解决方案如下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

答案4

结合sedxargsprintf:

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"or 管道headtail

相关内容