AWK处理数据直到下一场比赛

时间:2018-05-22 07:32:46

标签: linux awk sed sh

我正在尝试使用awk处理文件。 样本数据:

   233;20180514;1;00;456..;m
   233;1111;2;5647;6754;..;n
   233;1111;2;5647;2342;..;n
   233;1111;2;5647;p234;..;n
   233;20180211;1;00;780..;m
   233;1111;2;5647;3434;..;n
   233;1111;2;5647;4545;..;n
   233;1111;2;5647;3453;..;n

问题陈述是说我需要复制匹配“1; 00;”的第二列记录。跟踪记录直到下一个“1; 00;”匹配,然后进一步复制该记录的第二列,直到下一个“1; 00;”比赛。匹配模式“1; 00;”也可能会改变。 可以说是“2; 20;” 。在这种情况下,我需要复制第二列,直到有“1; 00;”或“2; 20;”匹配。

我可以使用while循环执行此操作,但我确实需要使用awk或sed来执行此操作,因为文件很大并且可能需要很长时间。

预期产出:

   233;20180514;1;00;456..;m
   233;20180514;1111;2;5647;6754;..;n+1
   233;20180514;1111;2;5647;2342;..;n+1
   233;20180514;1111;2;5647;p234;..;n+1
   233;20180211;1;00;780..;m
   233;20180211;1111;2;5647;3434;..;n+1
   233;20180211;1111;2;5647;4545;..;n+1
   233;20180211;1111;2;5647;3453;..;n+1

提前致谢。

1 个答案:

答案 0 :(得分:1)

编辑: 由于OP已更改了相关的示例Input_file,因此现在根据新示例添加代码。

awk -F";" '
length($2)==8 && !($3=="1" && $4=="00"){
   flag=""}
($3=="1" && $4=="00"){
   val=$2;
   $2="";
   sub(/;;/,";");
   flag=1;
   print;
   next
}
flag{
   $2=val OFS $2;
   $NF=$NF"+1"
}
1
' OFS=";"  Input_file

基本上检查8和第3和第4个字段的第2个字段的长度是否不是10条件,而不是检查;1;0

如果您的实际Input_file与显示的示例相同,则以下内容可能会对您有所帮助。

awk -F";" 'NF==5 || !/pay;$/{flag=""} /1;00;$/{val=$2;$2="";sub(/;;/,";");flag=1} flag{$2=val OFS $2} 1' OFS=";"  Input_file

<强> 说明:

awk -F";" '         ##Setting field separator as semi colon for all the lines here.
NF==5 || !/pay;$/{  ##Checking condition if number of fields are 5 on a line OR line is NOT ending with pay; if yes then do following.
  flag=""}          ##Setting variable flag value as NULL here.
/1;00;$/{           ##Searching string /1;00; at last of a line if it is found then do following:
  val=$2;           ##Creating variable named val whose value is $2(3nd field of current line).
  $2="";            ##Nullifying 2nd column now for current line.
  sub(/;;/,";");    ##Substituting 2 continous semi colons with single semi colon to remove 2nd columns NULL value.
  flag=1}           ##Setting value of variable flag as 1 here.
flag{               ##Checking condition if variable flag is having values then do following.
  $2=val OFS $2}    ##Re-creating value of $2 as val OFS $2, basically adding value of 2nd column of pay; line here.
1                   ##awk works on concept of condition then action so mentioning 1 means making condition TRUE and no action mentioned so print will happen of line.
' OFS=";" Input_file ##Setting OFS as semi colon here and mentioning Input_file name here.