web-dev-qa-db-ja.com

タブで区切られたbashの文字列を分割する方法

私はbashでタブ配信フィールドを分割しようとしています。

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

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

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

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

ただし、\ tはタブではなく文字 't'と一致します。これを行う最良の方法は何ですか?

ありがとう

29
chaimp

ファイルが次のようなものである場合(タブを区切り記号として):

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
55
Fredrik Pihl

つかいます - $'ANSI-C'文字列 パラメータ展開:

$ x=$'abc\tdef\tghi'
$ echo "$s"
abc     def     ghi
$ echo ">>${x%%$'\t'*}<<"
>>abc<<
13
glenn jackman

Awkを使用します。

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

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

tail yourfile | awk '{x=$1}END{print x}'
6
Michael
read field1 field2 <<< ${tabDelimitedField}

または

read field1 field2 <<< $(command_producing_tab_delimited_output)
3
user9118869

タブ区切り文字列には簡単な方法があります。それを配列に変換します。

タブ付きの文字列を作成します( '\ t'の解釈のために$を前に追加します):

AAA=$'ABC\tDEF\tGHI'

括弧を使用して文字列を配列として分割します。

BBB=($AAA) 

任意の要素へのアクセスを取得します:

echo ${BBB[0]}
ABC
echo ${BBB[1]}
DEF
echo ${BBB[2]}
GHI
0
Denis Capart
x=first$'\t'second
echo "${x%$'\t'*}"

[〜#〜] quoting [〜#〜] in man bash

0
Luchostein