줄 번호 목록을 기반으로 파일에서 줄을 읽고 출력을 유틸리티에 씁니다.

줄 번호 목록을 기반으로 파일에서 줄을 읽고 출력을 유틸리티에 씁니다.

다른 파일에서 읽으려는 줄 목록이 포함된 파일이 있습니다. 이 줄을 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

관련 정보