我有两个文件。这两个文件的内容都是动态的,由系统在需要时生成。
第一个文件包含特定行号的含义如下:
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