找到该行并附加到文件底部

找到该行并附加到文件底部

我有一个大文件,其中包含一些记录,这些记录的值与其他记录不同。

实际数据文件:

000000106500000000000129201300000U1E4600000060000+00000020400+00000002532+000000
0000001065000000000001182013000010144700002090000+00000335156+00000006776+000000
0000001065000000000003012014999999999924835390500+07164327872+00447479302+000000
0000001065000000000001102013000004QE8200000150000+00000056450+000000021

$ grep -n "9999999999" BADINS0000001065_000000000020140301.dat

我想将此记录附加到文件底部,如果我的文件中有大约 100 条记录,如果我的记录位置位于文件中的某个位置,我必须找到并从该位置删除(完全)并且需要附加到末尾文件的底部(文件的底部)。

目录中有很多文件,我想让它在每次运行时自动执行此过程。文件名是 BADINS0000001065_0000000000* 始终相同。

你能帮我实现这个目标吗?

答案1

awk你一起可以做到:

awk '
  /PATTERN/ { save = $0 ; next }
  { print }
  END { print save }
' infile > outfile

您必须在其中替换PATTERN为实际模式,并且infile是您的数据文件;适当地重命名它们。

代码的工作原理如下:

/PATTERN/ { save = $0 ; next }- 如果找到图案,请保存此行以供以后使用并跳过打印(因此将其从该位置删除)

{ print }- 打印文件中未被上一个命令跳过的那些行

END { print save }- 最后,处理完所有行后,附加保存的行,即模式匹配的行


如果你想用新文件覆盖原始文件,请在脚本mv后添加命令awk

mv outfile infile

再次使用适当选择的文件名。

答案2

其他 sed 解决方案

sed -i '
        /9999999999/{h;d};           # move match string in hold space
        $G;                          # append string from hold space to end
        s/\n$//                      # avoid empty line if pattern have not met 
       ' BADINS0000001065_0000000000*

答案3

问题不清楚是否9999999999始终存在,或者输入文件中是否可以有多个这样的实例。因此,这里有一个sed可以满足所有这些情况的版本。
请参阅man sed(选项-i)以了解输入文件的就地更新。

sed -n '/9999999999/{H;b n}; p; :n; ${g;s/\n//p}' file

相关内容