テキストファイル 各行の特定のポイントでテキストを編集する

テキストファイル 各行の特定のポイントでテキストを編集する

次の9桁の数字のリストを含むテキストファイルがあります。

550411876
550425175
550426504

2番目のテキストファイルには、次の行が含まれています。

09Y20171031    13415520171031    134155AP|AO|ABxxxxxxxxx|AC|CH|BIN|

xxxxxxxxx2番目のファイルに複数回表示されますが、最初のファイルの数字に置き換えられる行を含むテキストファイルを作成する必要があります(文字通りxxxxxxxxxファイルにあるため、これは単なる例ではありません)。この場合、結果は次のようになります。

09Y20171031    13415520171031    134155AP|AO|AB550411876|AC|CH|BIN|
09Y20171031    13415520171031    134155AP|AO|AB550425175|AC|CH|BIN|
09Y20171031    13415520171031    134155AP|AO|AB550426504|AC|CH|BIN|

Linuxでこれを行うにはどうすればよいですか?

答え1

数値がファイル内にあり、numbers使用したいテンプレートファイルが次のとおりであるとしますfile

awk -F'|' -v OFS='|' 'NR==FNR { n[++i] = $0; next } { for (i in n) { $3 = substr($3,1,2) n[i]; print } }' numbers file

最初に数字を配列として読み込み、次にテンプレートファイルnの場合、3番目に|区切られたフィールドの最初の2文字を使用して配列の数字に関連付け、各数字ごとnに結果を1回印刷します。

これらのオプションを使用すると、-区切りの方法でデータを読み書きできます-F'|' -v OFS='|'|

次に、出力を新しいファイルにリダイレクトします。

これは包含のためにテンプレートに依存しませんxxxxxxxxx

テストしてみてください:

$ cat file
09Y20171031    13415520171031    134155AP|AO|AB something something|AC|CH|BIN|

$ awk -F'|' -v OFS='|' 'NR==FNR { n[++i] = $0; next } { for (i in n) { $3 = substr($3,1,2) n[i]; print } }' numbers file
09Y20171031    13415520171031    134155AP|AO|AB550425175|AC|CH|BIN|
09Y20171031    13415520171031    134155AP|AO|AB550426504|AC|CH|BIN|
09Y20171031    13415520171031    134155AP|AO|AB550411876|AC|CH|BIN|

bash9 -esのみを使用する方法(外部ユーティリティなし)x

template=$(<file)
while read number; do
    printf '%s\n' "${template//xxxxxxxxx/$number}"
done <numbers

答え2

明らかに、テンプレートには1行しかありません...

これが本当なら、私たちはできる

for a in $(< list)
do
    printf "09Y20171031    13415520171031   134155AP|AO|AB%s|AC|CH|BIN|\n" $a
done

答え3

その他アッ方法:

awk 'NR==FNR{ a[++c]=$1; next }
     { for(i in a) { r=$0; sub(/x{9}/,a[i],r); print r } }' file1 file2
  • a[++c]=$1-file1配列から数値を取り込むa

  • for(i in a)- 繰り返し9桁

  • sub(/x{9}/,a[i],r)- キーシーケンスをxxxxxxxxx次に置き換えます。Next含まれる数量a[i]


出力:

09Y20171031    13415520171031    134155AP|AO|AB550411876|AC|CH|BIN|
09Y20171031    13415520171031    134155AP|AO|AB550425175|AC|CH|BIN|
09Y20171031    13415520171031    134155AP|AO|AB550426504|AC|CH|BIN|

答え4

Perl はここで欠かせません。

p=$(< pat) perl -nlE'$l = $ENV{p}; $n=$_; $l =~ s/x{9}/$n/; say $l if /./' nums

patスキーマファイル名

pパターンを渡す環境変数です。

n各反復の数を含むPerl変数。

lラインを含む(最初に各ラインのパターン、次に交換後に印刷される実際のライン)

nums数値ファイル名

関連情報