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


80

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

$ cat file

i am the first example.

i am the second line.

i do a question about a file.

그리고 나는 필요 :

example, line, file

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


1
빈 줄로 인해 "두 번째 줄"이 두 번째 줄에 없습니다. 나중에 모호하지 않은 예를 제공하십시오.
Adrian Frühwirth

답변:


93

시험

$ 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.

@Fredrik Pihl, 다음과 같이 각 코드 섹션에 설명을 추가 할 수 $NF있습니까? "이 코드는 awk에서받은 마지막 필드를 인쇄하여 인쇄합니다. "?
Alexej Magura

echo $ {line ## *};
code4cause

1
@ code4cause - 단지 고토 gnu.org/software/bash/manual/bash.html 및 검색 ##하거나 쉘에서 그것을 시도.
Fredrik Pihl

한 단어 만 있으면 아무 것도 반환하지 않습니다. $ echo "foo"| awk 'NF> 1 {print $ NF}'$
Ethan Post

85

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

grep -oE '[^ ]+$' file

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


3
그것은해야 grep -oE '[^ ]+$'당신이 때문에 브라우저 동작으로 여기에 탭이 표시 싶지만, 어쨌든,이뿐만 아니라 탭 공간을 고려, 또는 더 나은 아직 당신이 할 수있는,grep -oE '[^[:space:]]+$'
나빌 Kadimi


12

일반 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" ","

이것은 훨씬 더 간단한 해결책입니다! 나는 생각에 감사드립니다!
Captain Woof

6

여러 가지 방법이 있습니다. 같은 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

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


6

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 (모든 인스턴스에 대해)

참조 :


이 코드가 질문에 답할 수 있지만이 코드가 질문에 대한 답변 이유 및 / 또는 방법 에 대한 추가 컨텍스트를 제공 하면 장기적인 가치가 크게 향상됩니다. 제발 편집 약간의 설명을 추가 할 답변을.
Toby Speight 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.