与えられたファイルは次のとおりです
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 IT
Xにどのように変更しますか?
答え1
これが{tab}
空白の文字であると仮定すると...
または、すでにフィールド区切り文字として使用されているため、awk
タブ文字は表示されません。tr
cut
空のフィールドを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
答え2
この試み:
内容が「ファイル」ファイルに保存されているとします。
cat file | sed -E 's/ / x/'
減らす
CHrIS john xherzog 10001 Marketing
tim x johnson 10002 IT
ruth xbertha Hendric 10003 HR
christ jason hellan 10004 Marketing
なぜsed
このように書かれているのかは、以下を参照してください。これ
答え3
ファイルが最初からタブで区切られているとします。
$ cat -t file
CHrIS^Ijohn^Iherzog^I10001^IMarketing
tim^I^Ijohnson^I10002^IIT
ruth^Ibertha^IHendric^I10003^IHR
christ^Ijason^Ihellan^I10004^IMarketing
タスクがx
列 2 の空のフィールドに挿入されると仮定します。
$ awk -F'\t' 'BEGIN { OFS = FS } $2 == "" { $2 = "x" } { print }' file
CHrIS john herzog 10001 Marketing
tim x johnson 10002 IT
ruth bertha Hendric 10003 HR
christ jason hellan 10004 Marketing
スクリプトawk
はタブ文字を入力と出力の区切り文字として使用し、列2の空のフィールドを検出してに変更しますx
。
答え4
横
「sed」が「\t」「\n」エスケープシーケンスを理解しているとします。そうでなければWAがあります。しかし、これはコードの論理に害を及ぼすでしょう。
sed -e '
s/\t/\n/; # 1st field sep => \n , a char sure to not be in PS by definition
s/\n\t/\tx\t/; # incase 2nd field empty then we will see the \n\t else not
s/\n/\t/; # just incase 2nd fields was nonempty, preceding would fail so deal here
' yourfile
真珠
perl -F"\t" -pale '$F[1] || s/^\S+\t(?=\t)/$&x/' yourfile