40

bash でタブ区切りフィールドを分割しようとしています。

私はこの答えを知っています:シェルで文字列を分割して最後のフィールドを取得する方法

しかし、それはタブ文字には答えません。

タブ文字の前の文字列の一部を取得したいので、これを行っています:

x=`head -1 my-file.txt`
echo ${x%\t*}

しかし、\t は文字 't' に一致し、タブには一致しません。これを行う最善の方法は何ですか?

ありがとう

4

7 に答える 7

71

ファイルが次のようになっている場合 (セパレータとしてタブを使用):

1st-field   2nd-field

最初のフィールドを抽出するために使用できますcut(デフォルトではタブで動作します):

$ cut -f1 input
1st-field

を使用している場合、入力を次のように変更して、最後の行を取得するためにawkを使用する必要はありません。tail

1:1st-field     2nd-field
2:1st-field     2nd-field
3:1st-field     2nd-field
4:1st-field     2nd-field
5:1st-field     2nd-field
6:1st-field     2nd-field
7:1st-field     2nd-field
8:1st-field     2nd-field
9:1st-field     2nd-field
10:1st-field    2nd-field

awk を使用したソリューション:

$ awk 'END {print $1}' input
10:1st-field

純粋な bash ソリューション:

#!/bin/bash

while read a b;do last=$a; done < input
echo $last

出力:

$ ./tab.sh 
10:1st-field

最後に、を使用したソリューションsed

$ sed '$s/\(^[^\t]*\).*$/\1/' input
10:1st-field

ここで、$は範囲演算子です。つまり、最後の行のみを操作します。

元の質問には、リテラル タブを使用します。つまり、

x="1st-field    2nd-field"
echo ${x%   *}

出力:

1st-field
于 2011-07-11T19:50:33.890 に答える
16

パラメータ展開で$'ANSI-C'文字列を使用します。

$ x=$'abc\tdef\tghi'
$ echo "$s"
abc     def     ghi
$ echo ">>${x%%$'\t'*}<<"
>>abc<<
于 2011-07-11T21:23:53.433 に答える
7

awk を使用します。

echo $yourfield | awk '{print $1}'

または、あなたの場合、ファイルの最後の行の最初のフィールド

tail yourfile | awk '{x=$1}END{print x}'
于 2011-07-11T18:45:19.420 に答える
1

x=first$'\t'second
echo "${x%$'\t'*}"

の引用を参照してくださいman bash

于 2016-08-22T23:59:53.683 に答える