我有一个包含九位数字列表的文本文件,如下所示:
550411876
550425175
550426504
Run Code Online (Sandbox Code Playgroud)
还有一个包含如下一行的第二个文本文件:
09Y20171031 13415520171031 134155AP|AO|ABxxxxxxxxx|AC|CH|BIN|
Run Code Online (Sandbox Code Playgroud)
我需要制作一个文本文件,其中包含第二个文件中多次出现的行,但xxxxxxxxx
替换为第一个文件中的数字(xxxxxxxxx
字面意思是在文件中,这不仅仅是一个示例)。在这种情况下,结果将是:
09Y20171031 13415520171031 134155AP|AO|AB550411876|AC|CH|BIN|
09Y20171031 13415520171031 134155AP|AO|AB550425175|AC|CH|BIN|
09Y20171031 13415520171031 134155AP|AO|AB550426504|AC|CH|BIN|
Run Code Online (Sandbox Code Playgroud)
我如何在 Linux 中执行此操作?
假设数字在文件中numbers
并且您要使用的模板文件是file
:
awk -F'|' -v OFS='|' 'NR==FNR { n[++i] = $0; next } { for (i in n) { $3 = substr($3,1,2) n[i]; print } }' numbers file
Run Code Online (Sandbox Code Playgroud)
这将首先将数字读入数组n
,然后对于模板文件,使用第三个|
分隔字段中的前两个字符,将其与n
数组中的数字连接起来,并为每个数字打印一次结果。
这些-F'|' -v OFS='|'
选项确保我们以|
-delimited 的形式读取和写入数据。
然后只需将其输出重定向到一个新文件中。
这不依赖于模板来包含xxxxxxxxx
.
测试它:
$ cat file
09Y20171031 13415520171031 134155AP|AO|AB something something|AC|CH|BIN|
$ awk -F'|' -v OFS='|' 'NR==FNR { n[++i] = $0; next } { for (i in n) { $3 = substr($3,1,2) n[i]; print } }' numbers file
09Y20171031 13415520171031 134155AP|AO|AB550425175|AC|CH|BIN|
09Y20171031 13415520171031 134155AP|AO|AB550426504|AC|CH|BIN|
09Y20171031 13415520171031 134155AP|AO|AB550411876|AC|CH|BIN|
Run Code Online (Sandbox Code Playgroud)
一个bash
-只有方法(无外部公用事业),它采用九个x
-es:
template=$(<file)
while read number; do
printf '%s\n' "${template//xxxxxxxxx/$number}"
done <numbers
Run Code Online (Sandbox Code Playgroud)
显然你的模板只有一行......
如果这是真的,我们可以
for a in $(< list)
do
printf "09Y20171031 13415520171031 134155AP|AO|AB%s|AC|CH|BIN|\n" $a
done
Run Code Online (Sandbox Code Playgroud)