从一个文件的第n个索引附加到第n个索引

时间:2019-02-04 02:10:34

标签: shell awk sed

文件1:

1000000010019000000000012001011234567001011234567 2019013120190131
1000000010019000000000012001011234567001011234567 2019013120190131
1000000010019000000000012001011234567001011234567 2019013120190131
1000000010019000000000012001011234567001011234567 2019013120190131
1000000010019000000000012001011234567001011234567 2019013120190131
1000000010019000000000012001011234567001011234567 2019013120190131

文件2:

ABCDEFGHIJKLMNO
ZAEDWQOIRPFJVND
SDEOIMFUJRKDMEU
WOQOEMFJCMSKSLD
XNCJFURYYEJWODK
EIWKEMDLDDLFMVM

输出文件:

10000000100190000000000ABCDEFGHIJKLMNO12001011234567001011234567 2019013120190131
10000000100190000000000ZAEDWQOIRPFJVND12001011234567001011234567 2019013120190131
10000000100190000000000SDEOIMFUJRKDMEU12001011234567001011234567 2019013120190131
10000000100190000000000WOQOEMFJCMSKSLD12001011234567001011234567 2019013120190131
10000000100190000000000XNCJFURYYEJWODK12001011234567001011234567 2019013120190131
10000000100190000000000EIWKEMDLDDLFMVM12001011234567001011234567 2019013120190131

在这里,我需要将文件2的内容从文件1的第n个索引附加到文件1。

awk '$0=substr($0,1,10)"X"substr($0,12,length($0))' input.txt > output.txt

上面的awk命令对于文件作为输入来说效果很好。但是我需要一个变量作为输入,其值会随着每一行的变化而变化。

从文件2读取值并追加到文件1。从第n个索引到第n个索引。

3 个答案:

答案 0 :(得分:2)

您快到了。请尝试以下操作:

awk 'NR==FNR {line[FNR]=$0; next} {print substr($0,1,23) line[FNR] substr($0,24,length($0))}' file2 file1

产量:

10000000100190000000000ABCDEFGHIJKLMNO12001011234567001011234567 2019013120190131
10000000100190000000000ZAEDWQOIRPFJVND12001011234567001011234567 2019013120190131
10000000100190000000000SDEOIMFUJRKDMEU12001011234567001011234567 2019013120190131
10000000100190000000000WOQOEMFJCMSKSLD12001011234567001011234567 2019013120190131
10000000100190000000000XNCJFURYYEJWODK12001011234567001011234567 2019013120190131
10000000100190000000000EIWKEMDLDDLFMVM12001011234567001011234567 2019013120190131

[说明]

  • 脚本首先读取“ file2”,并将行存储在以行号line索引的数组FNR中。
  • 接下来,脚本读取“ file1”,并将该行插入与FNR关联的数组中。

[编辑]

这里是bash的替代品,以防万一:

paste -d "" <(cut -b 1-23 file1) file2 <(cut -b 24- file1)

希望这会有所帮助。

答案 1 :(得分:1)

另一个:

$ awk 'BEGIN{FS=OFS=""}NR==FNR{a[FNR]=$0;next}{$23=$23 a[FNR]}1' file2 file1

输出:

10000000100190000000000ABCDEFGHIJKLMNO12001011234567001011234567 2019013120190131
10000000100190000000000ZAEDWQOIRPFJVND12001011234567001011234567 2019013120190131
10000000100190000000000SDEOIMFUJRKDMEU12001011234567001011234567 2019013120190131
10000000100190000000000WOQOEMFJCMSKSLD12001011234567001011234567 2019013120190131
10000000100190000000000XNCJFURYYEJWODK12001011234567001011234567 2019013120190131
10000000100190000000000EIWKEMDLDDLFMVM12001011234567001011234567 2019013120190131

解释:

$ awk '
BEGIN {
    FS=OFS=""        # set delimiters to null, each char is a field
}
NR==FNR {     
    a[FNR]=$0        # hash
    next
}
{
    $23=$23 a[FNR]   # append to right field
}1' file2 file1      # output

经过gawk,mawk,busybox awk和original-awk的测试。

答案 2 :(得分:0)

就像@tshiono的评论一样,粘贴是处理此类情况的正确工具。如果您想尝试Perl,可以在下面进行操作

$ cat manoj1.txt
1000000010019000000000012001011234567001011234567 2019013120190131
1000000010019000000000012001011234567001011234567 2019013120190131
1000000010019000000000012001011234567001011234567 2019013120190131
1000000010019000000000012001011234567001011234567 2019013120190131
1000000010019000000000012001011234567001011234567 2019013120190131
1000000010019000000000012001011234567001011234567 2019013120190131

$ cat manoj2.txt
ABCDEFGHIJKLMNO
ZAEDWQOIRPFJVND
SDEOIMFUJRKDMEU
WOQOEMFJCMSKSLD
XNCJFURYYEJWODK
EIWKEMDLDDLFMVM

$

输入:

{{1}}