私はbashでタブ配信フィールドを分割しようとしています。
私はこの答えを知っています: シェルで文字列を分割して最後のフィールドを取得する方法
しかし、それはタブ文字については答えません。
タブ文字の前の文字列の一部を取得したいので、これをやっています:
x=`head -1 my-file.txt`
echo ${x%\t*}
ただし、\ tはタブではなく文字 't'と一致します。これを行う最良の方法は何ですか?
ありがとう
ファイルが次のようなものである場合(タブを区切り記号として):
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
つかいます - $'ANSI-C'
文字列 パラメータ展開:
$ x=$'abc\tdef\tghi'
$ echo "$s"
abc def ghi
$ echo ">>${x%%$'\t'*}<<"
>>abc<<
Awkを使用します。
echo $yourfield | awk '{print $1}'
または、あなたの場合、ファイルの最後の行の最初のフィールド
tail yourfile | awk '{x=$1}END{print x}'
read field1 field2 <<< ${tabDelimitedField}
または
read field1 field2 <<< $(command_producing_tab_delimited_output)
タブ区切り文字列には簡単な方法があります。それを配列に変換します。
タブ付きの文字列を作成します( '\ t'の解釈のために$を前に追加します):
AAA=$'ABC\tDEF\tGHI'
括弧を使用して文字列を配列として分割します。
BBB=($AAA)
任意の要素へのアクセスを取得します:
echo ${BBB[0]}
ABC
echo ${BBB[1]}
DEF
echo ${BBB[2]}
GHI
x=first$'\t'second
echo "${x%$'\t'*}"
[〜#〜] quoting [〜#〜] in man bash