横

与えられたファイルは次のとおりです

CHrIS   john    herzog  10001   Marketing
tim             johnson 10002   IT
ruth    bertha  Hendric 10003   HR
christ  jason   hellan  10004   Marketing

私のコード:

readFile=$1

#error checking to see if the file exists and is not a directory
if [ ! -f "$readFile" ]
then
    #echo failed no param passed
    exit 1
else
    #reads in the file and stores the information into the variabel var.
    while read -r var
    do
        #echo $var
        fName=$(echo "$var" | cut -f1 | awk '{print $1}')
        mName=$(echo "$var" | cut -f2 | awk '{print $2}' | tr "\t" "x")

        echo $mName
    done < $readFile
fi

2行目の中央にあるタブをtim (needs to be an X) johnson 10002 ITXにどのように変更しますか?

ベストアンサー1

これが{tab}空白の文字であると仮定すると...

または、すでにフィールド区切り文字として使用されているため、awkタブ文字は表示されません。trcut

空のフィールドをx。この場合、次のような構造を使用できます。

#!/bin/bash
#
while IFS= read -r line
do
    first=$(echo "$line" | awk -F$'\t' '{print $1}')
    middle=$(echo "$line" | awk -F$'\t' '{print $2}')
    last=$(echo "$line" | awk -F$'\t' '{print $3}')
    id=$(echo "$line" | awk -F$'\t' '{print $4}')
    dept=$(echo "$line" | awk -F$'\t' '{print $5}')

    echo "First is ${first:-x}"
    echo "Middle is ${middle:-x}"
    echo "Last is ${last:-x}"
    echo "Id is ${id:-x}"
    echo "Dept is ${dept:-x}"
    echo
done

分割は個々のインスタンスではなく空白(スペース、タブ、改行)で機能するため、IFS=$'\t' read -r first middle last...分割できません。read(実際にはそれより複雑です。詳細については、マニュアルページで「単語の分割」を参照してください。)

フィールドが不足するecho "$line" | cut -f1と、最後に見つかったフィールドを再利用するため、etcを使用しません。cut

"${middle:-x}"の代わりにx変数が設定に設定されていない場合は、実際に変数に割り当てることができます${middle:=x}:他のコマンドの副作用ではなく、自分で割り当てを行うには、前にno-opコマンドを付けます。

: ${middle:=x}
echo "The middle is $middle"    # Will be 'x' if it was unset

おすすめ記事