제어 파일에서 번호를 읽고 데이터 파일에서 일치하는 줄 번호를 추출합니다.

제어 파일에서 번호를 읽고 데이터 파일에서 일치하는 줄 번호를 추출합니다.

제어 파일(cntl.txt)이 있습니다.

2
3
5

데이터 파일 - data.txt

red
blue
yellow
green
violet
orange

제어 파일에서 일치하는 행을 읽어야 합니다. 여기서 예상되는 출력은 다음과 같습니다.

blue
yellow 
violet

답변1

매우 비효율적인 솔루션의 예:

for i in $(<control.txt); do awk -v c=$i 'NR~c{ print $0 }' data.txt; done;

나는 또한 오늘 밤에 배운 좋은 해결책을 보고합니다:

awk 'FNR==NR{ z[$0]++;next }; FNR in z' control.txt data.txt

답변2

만 사용POSIX 지정Sed의 특징:

sed -n -e "$(sed '/./s/$/p/' cntl.txt)" data.txt

물론 cntl.txt파일에 숫자 외에 줄이 있으면 오류가 발생할 수 있습니다. 그러나 빈 줄이 있으면 올바르게 처리됩니다(즉, 출력에 영향을 주지 않습니다).

답변3

이 시도:

join <(nl data.txt|sort -k1b,1) <(cat cntl.txt|sort -k1b,1) | sort -nk1,1 | cut -d' ' -f2-

nl - 줄을 열거해 줍니다.

 1  red
 2  blue
 3  yellow
 4  green
 5  violet
 6  orange

| sort -k1b,1 - 행 번호(첫 번째 필드)를 기준으로 사전순으로 정렬합니다.

고양이cntl.txt| sort -k1b,1 - 제어 파일을 동일한 순서로 정렬합니다.

2
3
5

Join <() <() - 첫 번째 필드(예: 줄 번호)에서 정렬된(및 번호가 지정된) "데이터"를 정렬된 "컨트롤"과 결합합니다.

2 blue
3 yellow
5 violet

|sort -nk1,1 - 결과를 숫자로 다시 정렬합니다(라인을 다시 순서대로 정렬하기 위해).

| cut -d' ' -f2- - 줄 번호 필드를 삭제합니다.

blue
yellow
violet

답변4

또 다른 가능한 해결책:

IFS=$'\n' read -d '' -r -a colors < 'data.txt'; unset IFS;

for i in $(<cntl.txt); do
        echo ${colors[i-1]} 
done

IFS 라인은 내부 파일 구분 기호를 개행으로 설정하고 data.txt의 각 라인을 배열에 삽입합니다. 그런 다음 cntl.txt의 행을 반복하고 주어진 인덱스가 있는 배열 요소를 인쇄합니다(data.txt를 0이 아닌 1에서 시작하므로 마이너스 1입니다. 그렇지 않으면 불필요합니다).

관련 정보