単一ファイルの行を1行ずつ比較し、出力を同じファイルに追加する方法

単一ファイルの行を1行ずつ比較し、出力を同じファイルに追加する方法

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

各行の末尾に、またはを追加する方法がわかりませんSUCCESSFAILUREそれを実現する方法を学びましょう!

答え1

これらすべてをawkで行うことができます。 awk は入力の各行に対してスクリプトを実行します。

awkステートメントは、print x yxと式のy間にスペースやフィールドの区切り文字なしで並べて印刷します。

awk表現はa ? b : c「if ais true then belse 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一致する文字列が引用されます\(...\)

関連情報