3つのテキストファイルがあります。 inで文字列を検索してfindの文字列file3
に置き換えたいと思います。で文字列の末尾にカスタムタグを追加し、その中の文字列部分を置き換える必要があります。file2
file1
file1
file3
file2
file3
aws ec2 create-tags --region us-east-1 --resourcesi-XXXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=arn:aws:iam::XXXXX:root
aws ec2 create-tags --region us-east-1 --resourcesi-XXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=arn:aws:iam::XXXXX:user/user
file2
arn:aws:iam::XXXXX:root
arn:aws:iam::XXXXX:user/user
file1
my_custom_tag_1
my_custom_tag_2
希望の出力:
aws ec2 create-tags --region us-east-1 --resourcesi-XXXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_1
aws ec2 create-tags --region us-east-1 --resourcesi-XXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_2
ファイルの行を配列にロードし、置換項目にインデックスを含めましたsed
。
sed "s|${file2array[0]}|${file1array[0]}|g" file3.txt
ただし、これは「古い正規表現なし」エラーを返します。また、forループを使用して配列インデックスを一意の変数に書き込み、上記と同じ方法を変数に使用してみました。
sed "s|$var2|$var1|g" file3.txt
これも失敗
楽しく、
sed "s|${file2array[0]}|customtext}|g" file3.txt
失敗したけど
sed "s|customtext|${file1array[0]}|g" file3.txt
効果がありました。
どんな助けでも大変感謝します。これまで何十時間もこれをやってきました。
答え1
努力する:
awk 'FNR==NR{a[FNR]=$0; next} NR<=length(a)+FNR{b[FNR]=$0; next} {for (i=1;i<=length(a);i++) gsub(a[i], b[i])} 1' file2 file1 file3
たとえば、
$ awk 'FNR==NR{a[FNR]=$0; next} NR<=length(a)+FNR{b[FNR]=$0; next} {for (i=1;i<=length(a);i++) gsub(a[i], b[i])} 1' file2 file1 file3
aws ec2 create-tags --region us-east-1 --resourcesi-XXXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_1
aws ec2 create-tags --region us-east-1 --resourcesi-XXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_2
どのように動作しますか?
FNR==NR{a[FNR]=$0; next}
これにより、file2のすべての行が配列に保存されます
a
。FNR は、現在のファイルから読み取った行数です。 NR は読み取った行の総数です。したがって
FNR==NR
、我々はFNRキーの下の配列に現在の行(で示されている)を追加しますfile2
。a[FNR]=$0
$0
a
このコマンドは、
next
awkに残りのコマンドをスキップして再起動するように指示しますnext
。NR<=length(a)+FNR{b[FNR]=$0; next}
これにより、file1のすべての行が配列に保存されます
b
。ここでは、同様のテストを使用して
NR<=length(a)+FNR
2番目のファイルを読み込んでいることを確認します。キーFNRの下の配列b[FNR]=$0
に現在の行(で示されている)を追加します。$0
b
このコマンドは、
next
awkに残りのコマンドをスキップして再起動するように指示しますnext
。for (i=1;i<=length(a);i++) gsub(a[i], b[i])
ここに到着すると、3番目のファイルを読んでいます。これは、file2の行に一致するすべてのテキストをfile1の対応するテキストに置き換えます。
配列
for (i=1;i<=length(a);i++)
内の各行の行番号を繰り返しますa
。gsub(a[i], b[i])
a[i]
すべてのテキスト項目を text に置き換えますb[i]
。file2 のテキストは正規表現として扱われます。このファイルに正規表現のアクティブ文字を含める必要がある場合は、エスケープする必要があります。
1
これはprint-the-lineのawkの神秘的な速記です。
答え2
私は書くことができます
awk '
BEGIN { FS = OFS = "=" }
FILENAME == "file1" {
tag[FNR] = $0
}
FILENAME == "file2" {
str[$0] = FNR
}
FILENAME == "file3" {
if ($NF in str) $NF = tag[str[$NF]]
print
}
' file1 file2 file3
とてもシンプルだと思います。ご質問がございましたらお知らせください。