Shell 在linux中合并两个不相等的文件
我需要合并2个文件到一个2列,它必须在终端(linux)完成。我在谷歌上搜索了很多,找到了“粘贴”的解决方案 粘贴f1 f2>f3 但结果是错误的,以下是文件: f1 f2Shell 在linux中合并两个不相等的文件,shell,unix,awk,terminal,paste,Shell,Unix,Awk,Terminal,Paste,我需要合并2个文件到一个2列,它必须在终端(linux)完成。我在谷歌上搜索了很多,找到了“粘贴”的解决方案 粘贴f1 f2>f3 但结果是错误的,以下是文件: f1 f2 只是文件头f1有300000条记录,f2有1M条记录。我也知道“awk”可以用来做这件事。我想用“awk”来完成它试试这个- #awk 'BEGIN{FS=","} NR==FNR{a[NR]=$1FS$2;next} {print $0,a[$1]}' f2 f1 1,2.46 1000001,1.77
只是文件头f1有300000条记录,f2有1M条记录。我也知道“awk”可以用来做这件事。我想用“awk”来完成它试试这个-
#awk 'BEGIN{FS=","} NR==FNR{a[NR]=$1FS$2;next} {print $0,a[$1]}' f2 f1
1,2.46 1000001,1.77
2,5.67 1000002,3.75
3,2.53 1000003,1.38
4,1.07 1000004,4.67
5,4.24 1000005,3.42
6,18.11 1000006,2.97
7,8.02 1000007,9.24
8,7.25 1000008,4.16
9,4.49 1000009,1.75
10,2.72 1000010,5.72
@索曼:基于这样的假设(你想同时打印f1和f2的所有行(第一行是f1,第二行是f2,打印时会有一个选项卡),那么文件f2中的任何额外行都应该一次性打印
awk 'FNR==NR{A[FNR]=$0;next} A[FNR]{print A[FNR] ORS "\t" $0;} !A[FNR]{B[++i]=$0} END{for(j=1;j<=i;j++){print "\t" B[j]}}' f1 f2
awk'FNR==NR{A[FNR]=$0;next}A[FNR]{print A[FNR]or“\t”$0;}!A[FNR]{B[++i]=$0}END{for(j=1;j您的文件包含control-Ms。请在您的输入文件上运行dos2unix
或类似操作,然后再次尝试paste
。如果您仍然有问题,请回答您的问题以显示预期的输出-到目前为止,您刚刚向我们显示了一种您不想要的输出格式。我将对我的文件使用awk,但“dos2unix”解决的问题输出是正确的。虽然这是我的假设,但我认为OP也需要那些在文件f1中匹配行数之后的行。
1,2.46
1000001,1.77
2,5.67
1000002,3.75
3,2.53
1000003,1.38
4,1.07
1000004,4.67
5,4.24
1000005,3.42
6,18.11
1000006,2.97
7,8.02
1000007,9.24
8,7.25
1000008,4.16
9,4.49
1000009,1.75
10,2.72
1000010,5.72
1000011,2.18
1000012,2.14
1000013,2.51
1000014,1.60
1000015,2.85
#awk 'BEGIN{FS=","} NR==FNR{a[NR]=$1FS$2;next} {print $0,a[$1]}' f2 f1
1,2.46 1000001,1.77
2,5.67 1000002,3.75
3,2.53 1000003,1.38
4,1.07 1000004,4.67
5,4.24 1000005,3.42
6,18.11 1000006,2.97
7,8.02 1000007,9.24
8,7.25 1000008,4.16
9,4.49 1000009,1.75
10,2.72 1000010,5.72
awk 'FNR==NR{A[FNR]=$0;next} A[FNR]{print A[FNR] ORS "\t" $0;} !A[FNR]{B[++i]=$0} END{for(j=1;j<=i;j++){print "\t" B[j]}}' f1 f2