我有一个大文件,其中包含一些记录,这些记录的值与其他记录不同。
实际数据文件:
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