'컷'을 사용하여 마지막 필드를 찾는 방법
사용하지 않음sed
또는awk
, 만 cut
필드 수를 알 수 없거나 행마다 변경되었을 때 마지막 필드를 얻으려면 어떻게 해야 합니까?
다음과 같은 작업을 수행할 수 있습니다.
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
설명.
rev
"maps.google.com"을 원래대로 되돌립니다.moc.elgoog.spam
cut
구분자로 점(즉, '.)을 사용하고 첫 번째 필드를 선택합니다.moc
- 마지막으로 다시 반대로 해서
com
매개 변수 확장을 사용합니다.이것은 외부 명령어보다 훨씬 효율적입니다.cut
(또는grep
)가 포함되어 있습니다.
data=foo,bar,baz,qux
last=${data##*,}
"Bash" 참조FAQ #100 - bash에서의 네이티브 문자열 조작에 대해 설명합니다.
이 방법만으로는 가능하지 않습니다.cut
여기 사용방법이 있습니다.grep
:
grep -o '[^,]*$'
다른 딜리미터는 콤마를 바꿉니다.
설명:
-o
(--only-matching
)는 패턴과 일치하는 입력 부분만 출력합니다(기본값은 일치하는 행 전체가 인쇄됩니다).[^,]
는 콤마 이외의 임의의 문자와 일치하는 문자 클래스입니다.*
위의 패턴에 0 이상의 시간이 일치하기 때문에[^,]*
0자 이상의 비문자 일치합니다.$
는 문자열의 끝과 일치합니다.- 이를 종합하면 패턴은 문자열 끝에 0자 이상의 콤마 이외의 문자와 일치합니다.
- 일치하는 항목이 여러 개 있을 경우
grep
가장 빨리 시작하는 것을 선호합니다.따라서 마지막 필드 전체가 일치합니다.
완전한 예:
data.csv라는 파일이 있는 경우
one,two,three
foo,bar
그리고나서grep -o '[^,]*$' < data.csv
will 출력
three
bar
awk 없이? 하지만 awk는 너무 간단해
echo 'maps.google.com' | awk -F. '{print $NF}'
AWK는 주머니에 넣기에 더 강력한 도구입니다. -F 필드 구분자 NF가 필드 수(마지막 색인)인 경우
여러 가지 방법이 있습니다.이것도 사용하셔도 됩니다.
echo "Your string here"| tr ' ' '\n' | tail -n1
> here
tr 명령어의 공백 입력은 필요한 딜리미터로 대체해야 합니다.
잘라내는 것 외에는 사용할 수 없는 유일한 해결책입니다.
echo "s.t.r.i.n.g." | cut - d'.' - f2 - [ scut _ spart _ part _ or _ until _ out _ of _ memory : ]| cut - d' . f2 -
이 솔루션을 사용하면 필드의 수를 알 수 없고 시간에 따라 다를 수 있습니다.단, 행 길이는 LINE_MAX 문자 또는 새 행 문자를 포함하여 필드를 초과할 수 없으므로 임의의 수의 필드를 이 솔루션의 실제 조건으로 포함할 수 없습니다.
네, 매우 어리석은 해결책이지만 제가 생각하기에 기준에 부합하는 유일한 해결책입니다.
경우 를 사용할 수 .basename
"subshell":
$ basename "$(echo 'maps.google.com' | tr '.' '/')"
는 안 써요.sed
★★★★★★★★★★★★★★★★★」awk
이 또한 .cut
그것도 그렇고, 단어대로 질문에 대답할 수 있을지 잘 모르겠어요.
슬래시를 포함할 수 있는 입력 문자열을 처리하는 경우에는 이 작업이 제대로 수행되지 않습니다.이 상황을 회피하려면 슬래시를 유효한 입력 문자열에 포함되지 않은 다른 문자로 바꿉니다.들어 「 」 「 」 「 」 )가 있습니다.|
파일명에도 문자를 사용할 수 없기 때문에, 다음과 같이 동작합니다.
$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'
perl을 사용하는 대체 방법은 다음과 같습니다.
perl -pe 's/(.*) (.*)$/$2/' file
서 할 수 있습니다.\t
중 file
하고 있다
awk
표 형식의 데이터를 사용할 때 사용합니다.이 될 수 awk
왜것것 용용 ?용 ???귀중한 시간을 낭비하지 말고 몇 가지 명령을 사용하여 작업을 완료하십시오.
예:
# $NF refers to the last column in awk
ll | awk '{print $NF}'
아래는 친구의 제안입니다.
#!/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
choose -1
[supports negative indexing]를 선택합니다(구문은 Python 슬라이스와 유사합니다).
파일 리스트라는 이름의 파일이 있는 경우.txt는 다음과 같은 목록 경로입니다.c : / param1 / param2 / file1 . h c : / param1 / param2 / file2 . h
rev file list를 실행할 수 있습니다.txt | cut -d"/" -f1 |rev
재미삼아 이 오래된 질문에 대한 접근 방식을 추가합니다.
$ 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 이외에는 컷만 사용합니다.음, 그리고 에코도 있는 것 같아.
후행 구분 기호가 존재하는지 확인하면 효과가 있다는 걸 깨달았어요.이 경우 쉼표와 공백 구분자가 있습니다.끝에 공백을 추가합니다.
$ 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' 카테고리의 다른 글
Windows Powershell에서의 Unix tail 등가 명령어 (0) | 2023.04.13 |
---|---|
n행부터 마지막행까지의 합계 (0) | 2023.04.13 |
키 목록을 통해 중첩된 사전 항목에 액세스하시겠습니까? (0) | 2023.04.13 |
윈도우즈 PowerShell 환경 변수 설정 (0) | 2023.04.08 |
SQL에서의 크로스 조인 vs 이너 조인 (0) | 2023.04.08 |