'cut'을 사용하여 마지막 필드를 찾는 방법
없이 사용 sed
하거나 awk
, 전용 cut
필드의 수는 모든 라인에 알 수없는하거나 변경할 때, 어떻게 마지막 필드를받을 수 있나요?
다음과 같이 시도해보십시오.
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
설명
- maps.google.com의 반대는
moc.elgoog.spam
cut
점을 구분 기호로 사용하고 첫 번째 필드를 선택합니다.moc
- 마지막으로, 우리는 그것을 다시 뒤집습니다 (알림, 감사합니다)
com
매개 변수 확장을 사용하십시오. 이것은 훨씬 더 효율적 어떤 외부 명령의 종류보다 cut
(또는 grep
포함).
data=foo,bar,baz,qux
last=${data##*,}
bash의 기본 문자열 조작에 대한 소개는 BashFAQ # 100 을 참조하십시오 .
를 사용하는 것은 불가능합니다 cut
. 사용하는 방법은 다음과 같습니다 grep
.
grep -o '[^,]*$'
다른 분리 문자의 경우 쉼표를 바꾸십시오.
awk없이? ... 그러나 awk로 너무 간단합니다.
echo 'maps.google.com' | awk -F. '{print $NF}'
AWK는 주머니에 더 강력한 도구입니다. 필드 구분 기호 NF가 필드 수인 경우 -F (마지막 인덱스도 나타냄)
여러 가지 방법이 있습니다. 이것도 사용할 수 있습니다.
echo "Your string here"| tr ' ' '\n' | tail -n1
> here
분명히 tr 명령에 대한 공백 입력은 필요한 구분 기호로 바꿔야합니다.
이것은 컷 이외의 것을 사용할 수있는 유일한 솔루션입니다.
에코 "문자열"| 컷 -d '.' -f2- [repeat_following_part_forever_or_until_out_of_memory :] | 컷 -d '.' -f2-
이 솔루션을 사용하면 실제로 필드 수를 알 수 없으며 때때로 달라질 수 있습니다. 그러나 줄 길이는 개행 문자를 포함하여 LINE_MAX 문자 또는 필드를 초과해서는 안되므로 임의의 수의 필드를이 솔루션의 실제 조건으로 포함 할 수 없습니다.
예, 매우 어리석은 해결책이지만 내가 생각하는 기준을 충족시키는 유일한 솔루션입니다.
#!/bin/bash
rcut(){
nu="$( echo $1 | cut -d"$DELIM" -f 2- )"
if [ "$nu" != "$1" ]
then
rcut "$nu"
else
echo "$nu"
fi
}
$ export DELIM=.
$ rcut a.b.c.d
d
다음과 같은 목록 경로 인 filelist.txt라는 파일이있는 경우 c : /dir1/dir2/file1.hc : /dir1/dir2/dir3/file2.h
다음을 수행 할 수 있습니다. rev filelist.txt | 컷 -d "/"-f1 | 신부님
입력 문자열에 슬래시가 포함되어 있지 않으면 basename
서브 쉘을 사용할 수 있습니다 .
$ basename "$(echo 'maps.google.com' | tr '.' '/')"
이것은 사용하지 않는 sed
나 awk
뿐만 아니라 사용하지 않는 cut
내가 확신 그것의 말로으로 질문에 대한 답변으로 자격이 있는지 아니에요, 그래서 하나.
슬래시를 포함 할 수있는 입력 문자열을 처리하는 경우 제대로 작동하지 않습니다. 이 상황에 대한 해결 방법은 슬래시를 유효한 입력 문자열의 일부가 아닌 다른 문자로 바꾸는 것입니다. 예를 들어 파이프 ( |
) 문자도 파일 이름에 사용할 수 없으므로 다음과 같이 작동합니다.
$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'
재미를 위해이 오래된 질문에 대한 접근 방식 추가 :
$ cat input.file # file containing input that needs to be processed
a;b;c;d;e
1;2;3;4;5
no delimiter here
124;adsf;15454
foo;bar;is;null;info
$ cat tmp.sh # showing off the script to do the job
#!/bin/bash
delim=';'
while read -r line; do
while [[ "$line" =~ "$delim" ]]; do
line=$(cut -d"$delim" -f 2- <<<"$line")
done
echo "$line"
done < input.file
$ ./tmp.sh # output of above script/processed input file
e
5
no delimiter here
15454
info
bash 외에도 cut 만 사용됩니다. 음, 반향합니다.
후행 구분 기호가 있는지 확인하면 작동합니다. 그래서 내 경우에는 쉼표와 공백 구분 기호가 있습니다. 끝에 공백을 추가합니다.
$ ans="a, b"
$ ans+=" "; echo ${ans} | tr ',' ' ' | tr -s ' ' | cut -d' ' -f2
b
참고 URL : https://stackoverflow.com/questions/22727107/how-to-find-the-last-field-using-cut
'Programing' 카테고리의 다른 글
JavaScript에서 정수를 이진수로 변환하는 방법은 무엇입니까? (0) | 2020.04.02 |
---|---|
Error Domain = NSURLErrorDomain Code = -1005“네트워크 연결이 끊어졌습니다.” (0) | 2020.04.02 |
Swift를 사용하여 키보드로 뷰 이동 (0) | 2020.04.02 |
Facebook API-Facebook API를 통해 Facebook 사용자의 프로필 이미지를 얻는 방법 (사용자가 응용 프로그램을 "허용"하지 않아도 됨) (0) | 2020.04.02 |
Angular.js 지시문에서 ng의 약자 (0) | 2020.04.02 |