![如何逐行比较单个文件中的行并将输出附加到同一文件](https://linux22.com/image/143531/%E5%A6%82%E4%BD%95%E9%80%90%E8%A1%8C%E6%AF%94%E8%BE%83%E5%8D%95%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E8%A1%8C%E5%B9%B6%E5%B0%86%E8%BE%93%E5%87%BA%E9%99%84%E5%8A%A0%E5%88%B0%E5%90%8C%E4%B8%80%E6%96%87%E4%BB%B6.png)
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
我不知道如何在每行末尾添加SUCCESS
or 。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
在运行此命令之前,请确保您的输入文件丢失了 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
引用 匹配的字符串\(...\)
。