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