[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'
:s
lobally가","
있는", "
g
ubstitutes (모든 인스턴스에 대해)
참조 :