2

I have a file like

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

this is what I try to get;

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

The second part of line which starts with "D:",if starts with "/", it should be write "try" else it has to write "pass" end of the line for every line in it.

I can read file like this but there is spaces which is another problem

In addition after "D:" always starts with "A" or "/".

I tried while loop but I have not succeeded.

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

Output

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

This is a example what I have tried

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

3 Answers 3

1

You can use awk, which makes it very easy to accomplish what you want:

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

Output:

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

This basically matches every line not containing D: and / and appends ;pass to it, then skips to the next line. Otherwise it appends ;try to it.

0

You can't write in the same file, I would recommend to create a new file and then rename it.

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
2
  • kkk S=D D: /kkkkk ;pass it writes pass beacause of the empty space before the "/" so can we add something that ignore the empty spaces? Commented Nov 13, 2018 at 17:51
  • I updated my answer, awk '{print $1}' will solve the issue with the empty space. Commented Nov 13, 2018 at 18:02
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
1
  • posixly: sed -e 's+D: */.*+&\t;try+ ; t' -e 's+$+\t;pass+' Commented Nov 13, 2018 at 21:18

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.