다음과 같은 텍스트 파일이 있습니다.
first, second
hello, bye
one, two
good, bad
day, night
grep
변수를 기반으로 주어진 줄의 마지막 단어를 검색하거나 사용하는 스크립트를 원합니다 awk
.
예를 들어 num이 이면 3
출력은 이어야 합니다 two
.
num의 값을 물어볼 필요가 없습니다.
답변1
사용 awk
:
$ awk -v num="$num" 'NR == num { print $NF }' data.in
테스트해보세요:
$ num=3
$ awk -v num="$num" 'NR == num { print $NF }' data.in
two
스크립트 awk
는 레코드별로 입력 파일 레코드를 읽습니다(한 레코드의 기본값은 한 줄입니다). 변수에 해당하는 레코드에 도달하면 num
해당 레코드의 마지막 필드를 인쇄합니다(필드는 기본적으로 공백으로 구분된 열입니다).
num
스크립트 내의 변수는 awk
명령줄에서 awk
쉘 변수 값으로 초기화하는 변수 입니다.num
-v num="$num"
NR
는 현재 레코드 번호이고 NF
레코드의 필드 수입니다. $NF
마지막 필드의 데이터입니다.
파일이 엄격하게 쉼표로 구분된 경우 -F ','
명령줄에 다음을 추가하세요.
$ awk -v num="$num" -F ',' 'NR == num { print $NF }' data.in
grep
특정 행을 선택할 수는 없지만 원하는 sed
행을 필터링한 다음 마지막 쉼표 뒤의 마지막 비트를 가져올 수 있습니다.
$ sed -n "${num}p" data.in | grep -o '[^,]*$'
이 sed
비트는 지정된 라인을 가져오고 grep
해당 라인의 마지막 쉼표 이후의 모든 내용을 추출합니다.
sed
다음과 같이 할 수도 있습니다.
$ sed -n "${num}s/^.*,\(.*\)$/\1/p" data.in
여기서 대체는 번호가 매겨진 줄에만 적용되며 $num
, 전체 줄을 마지막 쉼표 뒤의 줄 내용으로 대체하여 결과를 출력합니다. 다른 모든 출력은 -n
명령줄 스위치를 통해 억제됩니다.
또는 교체를 사용하여 줄 sed
의 마지막 쉼표까지 모든 내용을 삭제하면 됩니다.
$ sed -n "${num}s/^.*,//p" data.in
답변2
awk에서 NR은 행 번호이고 NF는 열 번호이므로 $NF가 마지막 열입니다. FS는 입력 레코드 구분 기호로, ', '
인용된 쉼표가 없는 CSV에 충분합니다.
awk -v FS=', ' 'NR==3{print $NF}'