파일에서 읽고 루프를 사용하여 새 줄을 반환합니다.

파일에서 읽고 루프를 사용하여 새 줄을 반환합니다.

이런 파일이 있어요

foo.txt

xxx B=C     D: A
yyy F=H     D:A
zzz K=L     D:  A
fff M=H     D:/llll
kkk S=D     D: /kkkkk

그것이 바로 제가 말하려는 것입니다.

xxx B=C;     D: A           ;pass
yyy F=H;     D:A            ;pass
zzz K=L;     D:  A          ;pass
fff M=H;     D:/llll        ;try
kkk S=D;     D: /kkkkk/bb   ;try

"D:"로 시작하는 줄의 두 번째 부분이 "/"로 시작하면 "try"라고 써야 하고, 그렇지 않으면 각 줄의 줄 끝에 "pass"라고 써야 합니다.

이렇게 파일을 읽을 수는 있지만 공백이 있습니다. 그건 또 다른 문제입니다.

또한 "D:" 앞에는 항상 "A" 또는 "/"가 옵니다.

while 루프를 시도했지만 성공하지 못했습니다.

cat /tmp/foo.txt | cut -d ":" -f,2

산출

 A      (one empty space)
A       (none)
   A    (three empty space)
/llll   (none)
 /kkkkk/bb (two empty space)

다음은 내가 시도한 예입니다.

while read -r line;
do 
if [[ $line ]]; then
          echo $line "try"
else
          echo $line "pass" 
fi
done < foo.txt

답변1

당신은 그것을 사용할 수 있습니다awk, 이를 통해 원하는 것을 쉽게 얻을 수 있습니다.

awk '!/D: *\//{print $0 " ;pass"; next} {print $0 " ;try"}' foo.txt

산출:

xxx B=C     D: A ;pass
yyy F=H     D:A ;pass
zzz K=L     D:  A ;pass
fff M=H     D:/llll ;try
kkk S=D     D: /kkkkk ;try

이것은 기본적으로 모든 줄과 일치합니다.포함되지 D:/거기에 추가 하고 ;pass다음 줄로 점프하세요. 그렇지 않으면 추가됩니다 ;try.

답변2

동일한 파일에 쓸 수 없으므로 새 파일을 만든 다음 이름을 바꾸는 것이 좋습니다.

tmpFile="/tmp/foo2.txt.tmp"

cat /tmp/foo.txt | while read line; do
      isSlash=$(echo $line | cut -d ":" -f2 | awk '{print $1}' | grep -c ^"/")
      if (( $isSlash )); then
          echo "$line ;try" >> $tmpFile
      else 
          echo "$line ;pass" >> $tmpFile
      fi
done

mv $tmpFile /tmp/foo.txt

답변3

sed좋아요?

$ sed '/D: *A/ s/$/\t;pass/; /D: *\// s/$/\t;try/' file
 xxx B=C     D: A   ;pass
 yyy F=H     D:A    ;pass
 zzz K=L     D:  A  ;pass
 fff M=H     D:/llll    ;try
 kkk S=D     D: /kkkkk  ;try

관련 정보