Shell 脚本匹配一个文件中的行号,并在匹配时将其作为注释放在另一个文件中

Shell 脚本匹配一个文件中的行号,并在匹配时将其作为注释放在另一个文件中

我有两个文件。这两个文件的内容都是动态的,由系统在需要时生成。

第一个文件包含特定行号的含义如下:

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开始
  • 读取第二个文件并检查等号之前的值是多少
  • 从 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数组以每个字段前面的数字为键=(加一)。

读取文件时simdb.txt,会对该文件中的行号进行测试。如果该行号是我们数组中的键s,则会创建所需的输出。输出是通过printf格式化字符串完成的,该字符串为左对齐字符串(来自 的数据simdb.txt)分配 20 个字符,后跟为该特定行//保存的数据。subscriber.txt

给出问题中数据的输出:

0='917598936722'    //MSISDN
4='ENG'             //Language
6='1234'            //SIM_PIN

相关内容