숫자를 나타내는 목록을 원합니다줄 번호소스 파일의 해당 행을 필터링하고 필터링하고 싶습니다. 소스 파일에서 이러한 줄을 추출하기 위해 Unix 파이프라인을 어떻게 구축할 수 있습니까?
파이프라인은 다음과 같습니다.
cat sourcefile.tsv | some-filter linenumbers.txt > extractedrecords.tsv
이 작업을 수행하기 위해 UNIX 도구의 조합을 즉시 생각할 수는 없습니다. 대체 방법은 sed -n [number]p sourcefile.tsv
linenumbers.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