如何逐行比较单个文件中的行并将输出附加到同一文件

如何逐行比较单个文件中的行并将输出附加到同一文件

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,

我需要逐行读取文件并比较之前和之后的值,如果两者相等,则写入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

我不知道如何在每行末尾添加SUCCESSor 。FAILURE知道如何实现这一目标!

答案1

您可以在 awk 中完成这一切。 awk 为其输入中的每一行运行脚本

awk 语句print x y将表达式x和打印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

在运行此命令之前,请确保您的输入文件丢失了 DOS 行终止符 ( <CR>= \r = 0x0D = ^M)。如果对所看到的内容感到满意,请重定向到结果文件

答案4

使用 GNU sed(如果命令以 standardt结尾,则需要一个标签):;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

两行生成的示例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引用 匹配的字符串\(...\)

相关内容