从文件中读取并使用循环返回新行

从文件中读取并使用循环返回新行

我有一个像这样的文件

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

相关内容