行番号リストに基づいてファイルから行を読み取り、出力をユーティリティに書き込みます。

行番号リストに基づいてファイルから行を読み取り、出力をユーティリティに書き込みます。

他のファイルから読みたい行のリストを含むファイルがあります。この行を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"ファイル内の各数値に対して、別のファイルからその行を抽出して印刷します。

同じで、次のようsedになりますxargs

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 -E '
    while(<>){
        chomp;
        if($file2) { say if exists $lines{$.} }
        else       { $lines{$_}++             }
    }   continue   { if (eof){$.=0; $file2++} }'\
    file_with_line_numbers other_file

答え4

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"だりパイプしたりするのではなく、各ファイルを一度読み込みます。headtail

関連情報