ファイルinput.txt
以下のデータをTAB区切り形式で-
23776112 Inactive Active
23415312 Inactive Active
要件に従って、whileループ内で、1列目のデータをカットして印刷したいと思います-
以下はコードの一部です
......
......
while read line
do
SN=`echo ${line}|cut -d ' ' -f1`
echo $SN
done < input.txt
....
....
上記の区切り文字としてタブを使用するには、私は使用しています Ctrl VTab
しかし、出力は期待どおりではありません。O/ P-
23776112 Inactive Active
23415312 Inactive Active
私はO/Pのようにしたいのに対し-
23776112 23415312
cut -f 1 input.txt
これにより、タブ区切りファイルの最初の列が得られますinput.txt
。 cut
のデフォルトのフィールド区切り文字はタブ文字であるため、これをさらに指定する必要はありません。
区切り文字が実際にスペースである場合は、
cut -d ' ' -f 1 input.txt
複数のタブまたはスペースがあることが判明した場合は、awk
を使用します:
awk '{ print $1 }' input.txt
cut
とawk
のどちらを使用するかに関係なく、この操作にはシェルループは必要ありません。
「 なぜシェルループを使用して、テキストを処理するのが悪い習慣と見なされているのですか? 」も参照してください。
スクリプトが機能しないのは、引用符で囲まれていない変数をecho
するとタブが消えるためです。
関連:
Tab はcut
のデフォルトのセパレータです。明示的な引数は必要ありません。
ただし、タブがスペースに変換されないようにするには、変数を引用符で囲む必要があります。
SN=`echo "${line}"|cut -f1`
ただし、最初にcut
を使用しないようにすることもできます。 IFS
を\t
に設定するだけです。
IFS=$'\t'
while read -r SN rest
do
echo "$SN"
done < input.txt
bash解釈
$'\t'
タブレーターなので、
cut -d $'\t' -f 1
タブレータをセパレータとして使用するようにcut
に指示する方法です(ただし、デフォルトなので、これは冗長です)。ただし、同じ構文でawkを使用することをお勧めします。
awk -v FS=$'\t' '{ print $1 }' < input.txt