web-dev-qa-db-ja.com

'cut'を使って最後のフィールドを見つける方法

なしでsedまたはawkを使用した場合、 only cut、フィールド数が不明な場合、または行ごとに変化する場合に最後のフィールドを取得する方法

222
noobcoder

あなたはこのようなことを試すことができます:

echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev

説明

  • maps.google.co.jpの逆はmoc.elgoog.spamになります
  • cutは区切り文字としてドットを使用し、最初のフィールドを選択します。これはmocです。
  • 最後に、comを取得するために、もう一度それを元に戻します(リマインダーのおかげで、@ tom)。
498
zedfoxus

パラメータ展開を使用してください。これは、cut(またはgrep)を含むあらゆる種類の外部コマンドよりはるかに効率的です。

data=foo,bar,baz,qux
last=${data##*,}

Bashでのネイティブ文字列操作の概要については、 BashFAQ#100 を参照してください。

102
Charles Duffy

cutだけでは不可能です。これはgrepを使う方法です:

grep -o '[^,]*$'

他の区切り文字のコンマを置き換えます。

74
tom

Awkがなければ... ...しかしawkを使えばとても簡単です。

echo 'maps.google.com' | awk -F. '{print $NF}'

AWKはあなたのポケットの中に持っているより強力なツールです。フィールドセパレータNFがフィールド数である場合は-F(最後のインデックスも表します)

24
Amir Mehler

複数の方法があります。あなたもこれを使うことができます。

echo "Your string here"| tr ' ' '\n' | tail -n1
> here

明らかに、trコマンドに入力された空白はあなたが必要とする区切り文字に置き換えられるべきです。

13
rjni

これはcut以外に何も使わないための唯一の解決策です:

echo "s.t.r.i.n.g." | cut -d '。' -f2- [repeat_following_part_forever_or_until_out_of_memory:] | cut -d '。' -f2-

この解決法を使用すると、フィールドの数は実際には未知であり、そして時々刻々変化することがある。ただし、行の長さは改行文字を含むLINE_MAX文字またはフィールドを超えてはならないため、このソリューションの実際の条件として、任意の数のフィールドが含まれることはありません。

はい、非常に愚かな解決策ですが、私が考える基準を満たす唯一のものです。

7
A friend

以下の道具 友達の提案

#!/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
2
user2166700

次のようなリストパスであるfilelist.txtという名前のファイルがあるとします。c:/dir1/dir2/file1.h c:/dir1/dir2/dir3/file2.h

その後、これを行うことができます。rev filelist.txt | cut -d "/" -f1 |回転

0
aperson1961

入力文字列にスラッシュが含まれていない場合は、basenameとサブシェルを使用できます。

$ basename "$(echo 'maps.google.com' | tr '.' '/')"

これはsedawkも使いませんが、またcutも使いませんので、それが質問に対する答えとしてふさわしいかどうかはよくわかりません。

スラッシュを含む可能性がある入力文字列を処理する場合、これはうまく機能しません。その場合の回避策は、スラッシュを、有効な入力文字列の一部ではないことがわかっている他の文字に置き換えることです。たとえば、パイプ(|)文字もファイル名には使用できないので、これは機能します。

$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'
0
jstine

この古い質問へのアプローチを追加するためには、次のようにします。

$ 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だけが使われています。さて、そしてエコー、私は思います。

0
Kaffe Myers

末尾の区切り文字が存在することを確認すれば、うまくいきます。だから私の場合私はカンマと空白の区切り記号があります。最後にスペースを入れます。 $ ans="a, b" $ ans+=" "; echo ${ans} | tr ',' ' ' | tr -s ' ' | cut -d' ' -f2 b

0
AnneTheAgile