Programing

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

lottogame 2020. 4. 2. 08:10
반응형

'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 '.' '/')"

이것은 사용하지 않는 sedawk뿐만 아니라 사용하지 않는 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

반응형