シェルスクリプトは、あるファイルの行番号を一致させ、一致すると、別のファイルにコメントとして配置します。

シェルスクリプトは、あるファイルの行番号を一致させ、一致すると、別のファイルにコメントとして配置します。

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

関連情報