【问题标题】:adding columns from one file after a column in a second file while considering the two files have different number of columns在第二个文件中的列之后添加一个文件中的列,同时考虑到这两个文件具有不同的列数
【发布时间】:2021-09-21 22:03:26
【问题描述】:

文件 1

001 00A 892 J27
002 00G 742 M65
003 00B 934 B32
004 00J 876 K57
005 00k 543 N21

文件 2 有 1,628,433 列,但想在该文件的第一列之后添加文件 1 中的所有四列。

a 2 T ..........
b 3 C ..........
c 4 G ..........
d 5 A ..........
e 6 B ..........

期望的输出

a 001 00A 892 J27 2 T ..........
b 002 00G 742 M65 3 C ..........
c 003 00B 934 B32 4 G ..........
d 004 00J 876 K57 5 A ..........
e 005 00k 543 N21 6 B ..........

尝试了以下

awk 'NR==FNR{a[FNR]=$1,$2,$3,$4} {print $1,a[FNR],$5}' file2 file1

【问题讨论】:

  • 第一行输出应该是a 001 00A 892 J27还是a 001 00A 892 J27 2 T ....
  • 这可行,但输出文件不是制表符分隔的,因为文件 1 &2 是
  • 这是一个令人惊讶的评论:您的问题中没有任何地方说“制表符分隔”。
  • @glennjackman 抱歉,我错过了您的第一个问题。第一个输出应该是您在第一个问题“a 001 00A 892 J27 2 T ....”中提出的第二个输出选项。

标签: unix awk paste cut


【解决方案1】:

这个版本在内存上更轻: 它一次只从每个文件中读取一行:

awk '{getline f1 < "file1"; $1 = $1 OFS f1; print}' file2

【讨论】:

  • 这几乎是正确的,但是两个输入文件都是制表符分隔的,所需的输出文件也是制表符分隔的。对不起,我忘了提我的问题。我尝试使用您的命令,但在制表符中添加了分隔符,但它仍然无法正常工作 awk '{getline f1
  • 使用awk -v OFS='\t' '...
【解决方案2】:

使用您展示的示例,请尝试关注awk 代码。

awk 'FNR==NR{arr[FNR]=$1;next} {$1=$1 OFS arr[FNR]} 1' file2 file1

解释: 简单的解释是,在读取 file2 时使用FNR==NR 条件。创建具有行号索引的数组,并将第一个字段作为其中的值。在读取 file1 时,将当前行的等效数组的值保存到第一个字段中,然后在那里打印当前行。

【讨论】:

    【解决方案3】:
    $ paste -d' ' <(cut -d' ' -f1 file2) file1 <(cut -d' ' -f2- file2)
    a 001 00A 892 J27 2 T ..........
    b 002 00G 742 M65 3 C ..........
    c 003 00B 934 B32 4 G ..........
    d 004 00J 876 K57 5 A ..........
    e 005 00k 543 N21 6 B ..........
    

    【讨论】:

      【解决方案4】:
      awk -F'\t' -v OFS="\t" '{getline f1 < "file1"; $1 = $1 OFS f1; print}' file2
      

      【讨论】:

        【解决方案5】:

        这是一个一次处理一行输入文件的python:

        python3 -c '
        import sys
        with open(sys.argv[1]) as f1, open(sys.argv[2]) as f2:
            for l1, l2 in zip(f1,f2):
                lf1,lf2=map(str.split, [l1,l2])
                print(" ".join([lf2[0]]+lf1+lf2[1:]))
        ' file1 file2 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-08
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          • 2021-10-16
          • 1970-01-01
          • 2019-11-07
          相关资源
          最近更新 更多