web-dev-qa-db-ja.com

UnixシェルスクリプトのCutでタブ区切り文字を使用する

ファイル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
4
Praveen Verma
cut -f 1 input.txt

これにより、タブ区切りファイルの最初の列が得られますinput.txtcutのデフォルトのフィールド区切り文字はタブ文字であるため、これをさらに指定する必要はありません。

区切り文字が実際にスペースである場合は、

cut -d ' ' -f 1 input.txt

複数のタブまたはスペースがあることが判明した場合は、awkを使用します:

awk '{ print $1 }' input.txt

cutawkのどちらを使用するかに関係なく、この操作にはシェルループは必要ありません。

なぜシェルループを使用して、テキストを処理するのが悪い習慣と見なされているのですか? 」も参照してください。


スクリプトが機能しないのは、引用符で囲まれていない変数をechoするとタブが消えるためです。

関連:

13
Kusalananda

Tabcutのデフォルトのセパレータです。明示的な引数は必要ありません。

ただし、タブがスペースに変換されないようにするには、変数を引用符で囲む必要があります。

SN=`echo "${line}"|cut -f1`

ただし、最初にcutを使用しないようにすることもできます。 IFS\tに設定するだけです。

IFS=$'\t'
while read -r SN rest
do 
    echo "$SN"
done < input.txt
2
Barmar

bash解釈

$'\t'

タブレーターなので、

cut -d $'\t' -f 1

タブレータをセパレータとして使用するようにcutに指示する方法です(ただし、デフォルトなので、これは冗長です)。ただし、同じ構文でawkを使用することをお勧めします。

awk -v FS=$'\t' '{ print $1 }' < input.txt
1
rexkogitans