他のレコードとは異なる値を持ついくつかのレコードを含む大容量ファイルがあります。
実際のデータファイル:
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