在文本文件每一行的特定点编辑文本

Jaz*_*Jaz 4 text-processing

我有一个包含九位数字列表的文本文件,如下所示:

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 中执行此操作?

Kus*_*nda 6

假设数字在文件中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)


JJo*_*oao 5

显然你的模板只有一行......

如果这是真的,我们可以

for a in $(< list)
do
    printf "09Y20171031    13415520171031   134155AP|AO|AB%s|AC|CH|BIN|\n" $a
done
Run Code Online (Sandbox Code Playgroud)