在第二个文件中的列之后添加一个文件中的列,同时考虑到这两个文件具有不同的列数

Posted

技术标签:

【中文标题】在第二个文件中的列之后添加一个文件中的列,同时考虑到这两个文件具有不同的列数【英文标题】: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==FNRa[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 ....”中提出的第二个输出选项。 【参考方案1】:

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

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

【讨论】:

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

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

awk 'FNR==NRarr[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 

【讨论】:

以上是关于在第二个文件中的列之后添加一个文件中的列,同时考虑到这两个文件具有不同的列数的主要内容,如果未能解决你的问题,请参考以下文章

如何编写 BigQuery/SQL 查询以将一个表中的列的平均值与第二个/另一个表中的列相除

Spark 中的数据框比较:Scala

BASH - 如何从 CSV 文件中的列中提取数据并将其放入数组中?

您如何从文件中的列中 grep/awk?

如果第二个表不存在连接,Mysql 使用一个表中的列值

包含多个世界的列中的全文搜索搜索