テーブルのフィールドを表すデータ列を含むフラットファイルがあります。外部ソースからこのファイルをインポートし、データベースのテーブルにデータを挿入しようとしています。残念ながら、私が受け取ったファイルの特定の列にフィールド(新しいフィールドを追加)がありませんでした。私に送信される内容を制御できないので、ファイルを編集してフィールドだけを追加したいと思います。sed
各行の特定の列にテキストを追加するために使用できますか?
たとえば、次のファイルがあるとします。
Alan Bradford 555-2012
Cathy Davies 555-7823
Edward Farris 555-9162
Gary Hobbs 555-5151
Irene Jacobs 555-1285
ファイルに地域番号がないので、213
前に追加したいと思います。電話番号は常に31列(一般文字数)で始まることがわかっています。だから見せたい
Alan Bradford 213 555-2012
Cathy Davies 213 555-7823
Edward Farris 213 555-9162
Gary Hobbs 213 555-5151
Irene Jacobs 213 555-1285
私はこれを3回のパスで行うことができることを知っています。cut -c1-30
パート1を使用して取得でき、cut -c31-
パート2も取得できます。その後、すべて一緒に貼り付けることができます。echo "$Part1 $NEWDATA $Part2" >> filename
sedを使うより簡単な方法があるかどうかを知りたいです。私は次のようなものを使用できるはずです
sed -e "30l,i213 " InFile > OutFile
1行に30文字以上を移動してから213
。
カットして貼り付けるオプションより何が効果があるか、より良いかを知っている人はいますか?
修正する
私は私の例が十分に正確ではなく、人々の時間の無駄を防ぐために質問を編集する必要があると言われました。私が提示した例は、この問題に対して非常に正確です。文字列「XXX」をY位置の前後に置くかどうかにかかわらず、常にY位置に挿入する方法は?
しかし、問題ありません。ここに私の実際のケースがあります。各行には928文字のテキストファイルがあります。 878番位置から文字列を挿入したいと思います。挿入したい位置の後の次のフィールドはメモフィールドなので、通常は空ですが、常に空ではないため、文字列の前と後の値は毎回同じにすることはできません。
@DonHolgoの答えは最も有望で良い答えです。しかし、私が好むUNIX(AIX 7.1)では、エラーが発生する前に最大255文字までしか追跡できないようです。
ここでは、255列に「XXX」を挿入します。
# sed 's/.\{255\}/&XXX /' OrigTextFile
1 030680001001YNPO 14 H502 000595000000000000 1 0000680M00000100000004799000000000000479900000004799000000004799000000000000479900000 SDI42028820 20P561292 00000000000XXX 000000000000000000000000000000000000000000000000000000000000000 T 0000655000000000Y 0000516000000000E 0000280000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 20200814
しかし、256列以上に同じ演算を挿入してみました。
# sed 's/.\{256\}/&XXX /' OrigTextFile
sed: 0602-404 Function s/.\{256\}/&XXX / cannot be parsed.
私のsedバージョンに制限があるようです。したがって、テキストファイルを切り取る元の計画に従う必要があるかもしれません。 File1 = テキストファイルの各行の最初の 878 文字 File2 = 追加する新しい文字列、元のファイルの 1 行に 1 つずつ File3 = 元のテキストファイルの残りの文字。
それから参加してください:
# paste File1 File2 File3 > NewTextFile
ベストアンサー1
あなたはそれを使用することができます
sed 's/.\{30\}/&213 /' InFile > OutFile
最初の30文字(「すべての文字」×30)をそれ自体(&
)+「213」に置き換えます。