Lê de um arquivo e retorna uma nova linha com o loop

2

Eu tenho um arquivo como

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

isto é o que tento obter;

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

A segunda parte da linha que começa com "D:", se começa com "/", deve ser escrita "try" senão tem que escrever "pass" fim da linha para cada linha nela.

Eu posso ler o arquivo como este, mas há espaços que é outro problema

Além disso, após "D:" sempre começa com "A" ou "/".

Eu tentei loop while, mas não consegui.

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

Saída

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

Este é um exemplo do que tentei

while read -r line;
do 
if [[ $line ]]; then
          echo $line "try"
else
          echo $line "pass" 
fi
done < foo.txt
    
por 1010111100011 13.11.2018 / 17:48

3 respostas

0

Você não pode escrever no mesmo arquivo, eu recomendo criar um novo arquivo e depois renomeá-lo.

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
    
por 13.11.2018 / 17:59
1

Você pode usar awk , o que torna muito fácil realizar o que você deseja:

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

Saída:

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

Isso basicamente corresponde a todas as linhas que não contêm D: e / e acrescenta ;pass a ele e passa para a próxima linha. Caso contrário, ele anexará ;try a ele.

    
por 13.11.2018 / 18:06
0

sed OK?

$ 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
    
por 13.11.2018 / 18:32