在第二个文件中的列之后添加一个文件中的列,同时考虑到这两个文件具有不同的列数
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 查询以将一个表中的列的平均值与第二个/另一个表中的列相除