레코드 목록에서 특정 행 번호를 효율적으로 선택하는 방법은 무엇입니까?

레코드 목록에서 특정 행 번호를 효율적으로 선택하는 방법은 무엇입니까?

숫자를 나타내는 목록을 원합니다줄 번호소스 파일의 해당 행을 필터링하고 필터링하고 싶습니다. 소스 파일에서 이러한 줄을 추출하기 위해 Unix 파이프라인을 어떻게 구축할 수 있습니까?

파이프라인은 다음과 같습니다.

cat sourcefile.tsv | some-filter linenumbers.txt  > extractedrecords.tsv

이 작업을 수행하기 위해 UNIX 도구의 조합을 즉시 생각할 수는 없습니다. 대체 방법은 sed -n [number]p sourcefile.tsvlinenumbers.txt의 모든 숫자에 대해 이를 수행하는 bash 스크립트를 작성하는 것입니다.

내 백업 계획이 다른 옵션에 비해 합리적으로 잘 작동하는 경우 해당 내용도 알려주시기 바랍니다.

답변1

linenumbers.txt각 행에 숫자가 있다고 가정

awk 'NR == FNR{a[$0]; next};FNR in a' linenumbers.txt sourcefile.csv > extractedrecords.tsv

일을 끝낼 수도 있습니다.

아니면bash

join  -t':' -o2.1,2.2  <(sort linenumbers.txt) <(awk '{print NR":"$0}' \
sourcefile.csv | sort -k1,1 -t':')  | sort -k1,1n -t':' | cut -f2- -d':'

join숫자로 정렬된 입력 파일이 지원되지 않으므로 모든 추가 점프가 필요합니다.

답변2

당신은 sed를 사용하여 올바른 길을 가고 있습니다. 당신이 해야 할 일은 줄 번호 목록과 p개행 문자를 변환하고 이를 sed 스크립트로 사용하는 것뿐입니다. 예를 들어, 공백으로 구분된 목록이 있는 경우:

lines="2 3 5 7 11 13"
<sourcefile.tsv sed -n "$(echo "$lines" | sed 's/$/p/; s/ /p\n/')"  >extractedrecords.tsv

awk는 또 다른 가능성입니다.

lines="2 3 5 7 11 13"
export lines
<sourcefile.tsv awk '" "ENVIRON["lines"]" " ~ " "NR" "' >extractedrecords.tsv

관련 정보