단일 파일의 줄을 한 줄씩 비교하고 출력을 동일한 파일에 추가하는 방법

단일 파일의 줄을 한 줄씩 비교하고 출력을 동일한 파일에 추가하는 방법

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. 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

<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

두 줄로 생성된 예 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일치하는 문자열이 인용 됩니다 \(...\).

관련 정보