[linux] Bash를 사용하여 각 줄의 마지막 단어를 얻는 방법

예를 들어 파일이 있습니다.

$ cat file

i am the first example.

i am the second line.

i do a question about a file.

그리고 나는 필요 :

example, line, file

나는 “awk”로 의도했지만 문제는 단어가 다른 공간에 있다는 것입니다.



답변

시험

$ awk 'NF>1{print $NF}' file
example.
line.
file.

예제에서와 같이 한 줄로 결과를 얻으려면 다음을 시도하십시오.

{
    sub(/\./, ",", $NF)
    str = str$NF
}
END { print str }

산출:

$ awk -f script.awk file
example, line, file,

순수 bash :

$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file
example.
line.
file.


답변

grep으로 쉽게 할 수 있습니다.

grep -oE '[^ ]+$' file

( -E확장 된 정규식 사용; -o전체 행이 아닌 일치하는 텍스트 만 출력)


답변

awk에서 다음과 같이 할 수 있습니다.

awk '{ print $NF }'

편집 : 빈 줄을 피하려면 :

awk 'NF{ print $NF }'


답변

일반 bash에서이를 수행하는 또 다른 방법은 다음 rev과 같은 명령 을 사용하는 것입니다 .

cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","

기본적으로 파일의 줄을 뒤집은 다음 cut공백을 구분 기호로 사용하여 분할하고 cut생성 하는 첫 번째 필드를 가져온 다음 토큰을 다시 뒤집고 tr -d원하지 않는 문자를 삭제 하는 데 사용 하고 tr다시 줄 바꿈 문자를,

또한 다음을 수행하여 첫 번째 고양이를 피할 수 있습니다.

rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","


답변

여러 가지 방법이 있습니다. 같은 awk솔루션 프로그램, 그것은 깨끗한 해결책이다

sed 솔루션은 마지막 공간까지 아무것도 삭제하는 것입니다. 따라서 끝에 공간이 없으면 작동합니다.

sed 's/.* //g' <file>

당신은 sed또한 피하고 while루프 로 갈 수 있습니다 .

while read line
do [ -z "$line" ] && continue ;
echo $line|rev|cut -f1 -d' '|rev
done < file

한 줄을 읽고 존경하며 첫 번째 줄 (즉, 원본의 마지막 줄)을 잘라 내고 다시 복원합니다.

순수한 bash 방식으로 동일한 작업을 수행 할 수 있습니다.

while read line
do [ -z "$line" ] && continue ;
echo ${line##* }
done < file

매개 변수 확장이라고합니다.


답변

tldr;

$ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g'

이와 같은 파일의 경우

$ cat file.txt
The quick brown fox
jumps over
the lazy dog.

주어진 명령이 인쇄됩니다

fox, over, dog.

작동 원리 :

  • awk '{print $NF}' : 모든 행의 마지막 필드를 인쇄합니다.
  • paste -sd,: stdin직렬로 읽고 ( -s, 한 번에 한 파일 씩) 쉼표로 구분 된 필드 ( -d,)를 씁니다.
  • sed 's/,/, /g': slobally가 ","있는 ", " gubstitutes (모든 인스턴스에 대해)

참조 :


답변