제어 파일(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 - 줄 번호(첫 번째 필드)를 기준으로 사전순으로 정렬합니다.
cat 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의 줄을 반복하고 주어진 인덱스가 있는 배열 요소를 인쇄합니다(0이 아닌 1에서 data.txt를 시작하므로 마이너스 1입니다. 그렇지 않으면 필요하지 않습니다).