如何在每个匹配的行

时间:2017-03-15 10:15:28

标签: bash shell awk sed

我需要在每个匹配行前附加两个单词 -

有以下文字文件 -

demo.txt -

Good
70 80 75 77 82
Best
Fail
34 32 30 24 29

我正在寻找的是,如果它找到了好的话,它应该在它之前加上2个字 - 如下所示 - 好

(sysdate) Good 70 80 75 77 82

如果没有找到记录,不应该做最好的记录,因为没有记录,所以不需要追加(sysdate)最好在它的前面。

但这里的技巧是,它应检查两个条件,第一个状态为Good,Best或Fail状态,如果关联记录为空,则无需附加任何内容。

下面是shell脚本的简短代码 -

#!/bin/bash

TIME=`date +"%Y-%m-%d %H:%M:%S"`
log="demo.txt"

for line in $log
   do
     if $line eq 'Good'; then
          sed "/$line/!p s/[[:space:]]\+$//g" $log | sed "s/^/$TIME,Good /g" $log | sed 's/ /,/g' $log > demo.csv
     elif $line eq 'Best'; then
          sed "/$line/!p s/[[:space:]]\+$//g" $log | sed "s/^/$TIME,Best /g"   $log | sed 's/ /,/g' $log > demo.csv
     else
          sed "/$line/!p s/[[:space:]]\+$//g" $log | sed "s/^/$TIME,Fail /g" $log | sed 's/ /,/g' $log > demo.csv
     fi
done

注意: - 查找以下输出到csv文件 -

demo.csv -

Good
(sysdate),Good,70,80,75,77,82
Best
Fail
(sysdate),Fail,34,32,30,24,29

1 个答案:

答案 0 :(得分:1)

<强>输入

$ cat demo.txt
Good
70 80 75 77 82
Best
Fail
34 32 30 24 29

<强>输出

$ awk -v OFS="," 'NF==1{ print; s=$0; next}{$1=$1; print "(sysdate)",s,$0}' demo.txt
Good
(sysdate),Good,70,80,75,77,82
Best
Fail
(sysdate),Fail,34,32,30,24,29

使用日期时间

$ awk -v t="$(date +'%Y-%m-%d %H:%M:%S')" -v OFS="," 'NF==1{ print; s=$0; next}{$1=$1; print t,s,$0}' demo.txt
Good
2017-03-15 17:12:16,Good,70,80,75,77,82
Best
Fail
2017-03-15 17:12:16,Fail,34,32,30,24,29

$ awk -v OFS="," 'BEGIN{t=strftime("%Y-%m-%d %H:%M:%S",systime())}NF==1{ print; s=$0; next}{$1=$1; print t,s,$0}' demo.txt
Good
2017-03-15 17:18:50,Good,70,80,75,77,82
Best
Fail
2017-03-15 17:18:50,Fail,34,32,30,24,29

<强>解释

awk -v OFS="," '                  # call awk set o/p field separator as comma
      BEGIN{                      # Begin block here we save system datetime in variable t and is gwak specific
             t=strftime("%Y-%m-%d %H:%M:%S",systime())
      }
     NF==1{                       # if no of fields/columns is equal to 1 then
               print;             # print current record/line/row
               s=$0;              # save current line in variable s
               next               # stop processing go to next line
      }
      {
               $1=$1;             # record recompilation 
                                  # since you need comma as separator between fields in o/p,  
                                  # you can also do $2=$2
                                  # assigning any value to any field ($1, etc.) 
                                  # causes record recompilation
               print t,s,$0       # print variable t, s and current line
      }' demo.txt