abc.csv
次の内容を含むファイルがあります。
a6caa290d03ae75dd5f3bf9214f0b523;CO.jar,a6caa290d03ae75dd5f3bf9214f0b523;CO.jar,
a1a5bf1547f50feea4120290343f89e4;Common.jar,a1a5bf1547f50feea4120290343f89e4;Common.jar,
1264897ea44d85c3f0dba127ff02f514;DA.jar,1264897ea44d85c3f0dba127ff02f514;DA.jar,
e77834d4ba2a4193b94fee9470a458a4;FW.jar,e77834d4ba2a4193b94fee9470a458a4;FW.jar,
ファイルを1行ずつ読み取り、前の値と後の値を比較して両方が,
同じ場合はSUCCESS
行の同じ端に書き、それ以外の場合は行FAILURE
の同じ端に書き込む必要があります。
私は次を試しました。
for I in `cat abc.csv`
do
VAR1=`echo $I | awk -F"," {'print ${1}'}
VAR2=`echo $I | awk -F"," {'print ${2}'}
if [ ${1} == ${2} ]
then
..
fi
done
各行の末尾に、またはを追加する方法がわかりませんSUCCESS
。FAILURE
それを実現する方法を学びましょう!
答え1
これらすべてをawkで行うことができます。 awk は入力の各行に対してスクリプトを実行します。
awkステートメントは、print x y
式x
と式のy
間にスペースやフィールドの区切り文字なしで並べて印刷します。
awk表現はa ? b : c
「if a
is true then b
else c
」を意味します。
awk -F"," '{ print $0 (($1 == $2) ? "SUCCESS" : "FAILURE") }' < abc.csv
答え2
この試み、
for I in `cat abc.csv`
do
var1=`echo "$I" | awk -F "," '{print $1}'`
var2=`echo "$I" | awk -F "," '{print $2}'`
if [ $var1 == $var2 ]; then
sed -i 's/'$var1','$var2'/'$var1','$var2',SUCCESS/' abc.csv
else
sed -i 's/'$var1','$var2'/'$var1','$var2',FAIL/' abc.csv
fi
done
裏地もあります:
echo "`awk -F"," '{ if($1 == $2) {print $1","$2",SUCCESS"} else {print $1","$2",FAILURE"} }' abc.csv`" > abc.csv
答え3
また試み
sed -r 's/^(.*,)\1/& SUCCESS/; t; s/$/ FAILURE/;' file
<CR>
このコマンドを実行する前に、入力ファイルにDOS行終端文字(= \ r = 0x0D = ^ M)がないことを確認してください。表示された内容が気に入ったら、結果ファイルにリダイレクトしてください。
答え4
GNUの使用sed
(コマンドがt
標準で終わる場合はラベルが必要です):;
sed
$ sed '/^\([^,]*,\)\1/s/$/SUCCESS/;t;s/$/FAILURE/' file
a6caa290d03ae75dd5f3bf9214f0b523;CO.jar,a6caa290d03ae75dd5f3bf9214f0b523;CO.jar,SUCCESS
a1a5bf1547f50feea4120290343f89e4;Common.jar,a1a5bf1547f50feea4120290343f89e4;Common.jar,SUCCESS
1264897ea44d85c3f0dba127ff02f514;DA.jar,1264897ea44d85c3f0dba127ff02f514;DA.jar,SUCCESS
e77834d4ba2a4193b94fee9470a458a4;FW.jar,e77834d4ba2a4193b94fee9470a458a4;FW.jar,SUCCESS
2行で作成された例FAILURE
:
$ sed '/^\([^,]*,\)\1/s/$/SUCCESS/;t;s/$/FAILURE/' file
a6caa290d03ae75dd5f3bf9214f0b523;CO.jar,a6caa290d03ae75dd5f3bf9214f0b523;CO.jar,SUCCESS
1a5bf1547f50feea4120290343f89e4;Common.jar,a1a5bf1547f50feea4120290343f89e4;Common.jar,FAILURE
1264897ea44d85c3f0dba127ff02f514;DA.jar,1264897ea44d85c3f0dba127ff02f514;DA.jar,SUCCESS
77834d4ba2a4193b94fee9470a458a4;FW.jar,e77834d4ba2a4193b94fee9470a458a4;FW.jar,FAILURE
コメント付きのスクリプトsed
:
/^\([^,]*,\)\1$/s/$/SUCCESS/; # this lines looks like XXX,XXX,
# add SUCCESS at the end of the line
t; # branch to end of script if last s command did something
s/$/FAILURE/ # add FAILURE at the end of the line
GNUを使用して内部編集を実行するには、sed
上記のコマンドを使用sed -i
しますsed
。
説明:この正規表現が一致すると、次の置換が行われ、行の末尾に追加/^\([^,]*,\)\1/
されます。SUCCESS
正規表現は、行の先頭から最初のコンマまでの文字列と一致します。その後、同じ文字列と一致しようとします。再び最初の直後。\1
一致する文字列が引用されます\(...\)
。