.csv 파일의 특정 행의 마지막 단어를 grep합니다.

.csv 파일의 특정 행의 마지막 단어를 grep합니다.

다음과 같은 텍스트 파일이 있습니다.

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}'

관련 정보