2つのファイルがあります。両方のファイルの内容は動的であり、必要に応じてシステムによって生成されます。
最初のファイルには、次の意味を持つ特定の行番号が含まれています。
head simdb.txt
MSISDN
Account_ID
COSP_ID
Currency
Language
Home_Zone
SIM_PIN
Screening_PIN
Third_ParAnothercess_PIN
Cumulative_Incorrect_PIN
他のファイルには、次の動的データが含まれています。
head subscriber.txt
0='917598936722' 4='ENG' 6='1234'
出力は次のようになります。
0='917598936722' //MSISDN
4='ENG' //Language
6='1234' //SIM_PIN
質問が更新されました========
上記のクエリに加えて、subscriber.txtに複数の行がある場合、スクリプトが最初に行を印刷してから目的の出力を印刷するにはどうすればよいですか?たとえば、次の subscriber.txt ファイルがある場合
head subscriber.txt
0='917598936722' 4='ENG' 6='1234'
0='919654680634' 4='ENG' 6='1234'
その後、希望の出力は次のようになります。
0='917598936722' 4='ENG' 6='1234'
0='917598936722' //MSISDN
4='ENG' //Language
6='1234' //SIM_PIN
===========================================
0='919654680634' 4='ENG' 6='1234'
0='919654680634' //MSISDN
4='ENG' //Language
6='1234' //SIM_PIN
答え1
awk 'NR==FNR
{Arr[NR-1]=$0;
next}
{for(i=1;i<=NF;i++)
{split($i,a,"=");
print $i " //"Arr[a[1]]}
}'simdb.txt subscriber.txt
- simdb.txtのすべての行を読み取り、配列に保存します。インデックスは0から始まります
- 2番目のファイルを読み、等号の前の値が何であるかを確認してください。
- Arrから値を読み取り、印刷します。
答え2
awk 'FNR==NR { for (i=1; i<=NF; ++i) {
split($i, a, "=")
s[a[1]+1] = $i }; next }
FNR in s { printf("%-20s//%s\n", s[FNR], $0) }' subscriber.txt simdb.txt
まず、短いファイルのフィールドを読み取り、subscriber.txt
その値を配列に割り当てますs
。配列s
は各フィールドの前の数字=
(1加算)で入力されます。
ファイルを読み取ると、simdb.txt
ファイルの行番号がテストされます。その行番号が配列のキーである場合は、s
目的の出力が生成されます。出力は、左揃えの文字列(データ)に20文字を割り当て、その後にその特定の行に保持されているデータを割り当てるフォーマットされたprintf
文字列を介して行われます。simdb.txt
//
subscriber.txt
質問のデータ出力を提供します。
0='917598936722' //MSISDN
4='ENG' //Language
6='1234' //SIM_PIN