programing

'컷'을 사용하여 마지막 필드를 찾는 방법

padding 2023. 4. 13. 20:38
반응형

'컷'을 사용하여 마지막 필드를 찾는 방법

사용하지 않음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.csvwill 출력

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

서 할 수 있습니다.\tfile하고 있다

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

반응형