我有超过 10 个文件,所有文件中的第一列都是相同的,我需要根据一个文件中的第一列收集所有文件中的所有第 2 列。我尝试过粘贴然后awk但这仅打印前 10 个文件中的列
paste p{01..20}.dat | awk '{print $1" "$2" "$4" "$6" "$8" "$10" "$12" "$14" "$16" "$18" "$20}' > output.dat
p01.dat 文件的示例
0.000 1.3594
0.500 1.3600
1.000 1.3603
1.500 1.3601
2.000 1.3595
2.500 1.3584
3.000 1.3570
3.500 1.3552
4.000 1.3530
4.500 1.3506
所有其他文件都具有相同的格式和相同的第一列
答案1
只是 @John1024 解决方案的一个变体:
paste -d '=' p*.dat | sed 's/=\S*//g'
答案2
你需要一个for
循环。尝试:
paste p{01..20}.dat | awk '{printf "%s",$1; for (i=2;i<=NF;i=i+2) printf " %s",$i; print ""}'
例子
让我们采用三个输入文件:
$ paste p*.dat
1 a 1 aa 1 aaa
2 b 2 bb 2 bbb
3 c 3 cc 3 ccc
我们的命令生成:
$ paste p*.dat | awk '{printf "%s",$1; for (i=2;i<=NF;i=i+2) printf " %s",$i; print ""}'
1 a aa aaa a a a a a a a a a a a a a a a a a
2 b bb bbb b b b b b b b b b b b b b b b b b
3 c cc ccc c c c c c c c c c c c c c c c c c
使用 20 个文件的示例
我们将从上面的三个文件开始,然后创建另外 17 个文件:
for i in {04..20}; do cp p01.dat p$i.dat; done
我们可以验证粘贴是否有效:
$ paste p{01..20}.dat
1 a 1 aa 1 aaa 1 a 1 a 1 a 1 a 1 a 1 a 1 a 1 a 1 a 1 a 1 a 1 a 1 a 1 a 1 a 1 a 1 a
2 b 2 bb 2 bbb 2 b 2 b 2 b 2 b 2 b 2 b 2 b 2 b 2 b 2 b 2 b 2 b 2 b 2 b 2 b 2 b 2 b
3 c 3 cc 3 ccc 3 c 3 c 3 c 3 c 3 c 3 c 3 c 3 c 3 c 3 c 3 c 3 c 3 c 3 c 3 c 3 c 3 c
我们还可以验证 awk 命令是否有效:
$ paste p{01..20}.dat | awk '{printf "%s",$1; for (i=2;i<=NF;i=i+2) printf " %s",$i; print ""}'
1 a aa aaa a a a a a a a a a a a a a a a a a
2 b bb bbb b b b b b b b b b b b b b b b b b
3 c cc ccc c c c c c c c c c c c c c c c c c
答案3
paste
+cut
+seq
诡计:
paste -d' ' p{01..20}.dat | cut -d' ' -f1,"$(seq -s',' 2 2 20)"
测试用例(3 个文件):
$ head p0[1-3].dat
==> p01.dat <==
0.000 1.3594
0.500 1.3600
1.000 1.3603
1.500 1.3601
2.000 1.3595
2.500 1.3584
3.000 1.3570
3.500 1.3552
4.000 1.3530
4.500 1.3506
==> p02.dat <==
0.000 2.3594
0.500 2.3600
1.000 2.3603
1.500 2.3601
2.000 2.3595
2.500 2.3584
3.000 2.3570
3.500 2.3552
4.000 2.3530
4.500 2.3506
==> p03.dat <==
0.000 3.3594
0.500 3.3600
1.000 3.3603
1.500 3.3601
2.000 3.3595
2.500 3.3584
3.000 3.3570
3.500 3.3552
4.000 3.3530
4.500 3.3506
paste -d' ' p{01..03}.dat | cut -d' ' -f1,"$(seq -s',' 2 2 6)"
0.000 1.3594 2.3594 3.3594
0.500 1.3600 2.3600 3.3600
1.000 1.3603 2.3603 3.3603
1.500 1.3601 2.3601 3.3601
2.000 1.3595 2.3595 3.3595
2.500 1.3584 2.3584 3.3584
3.000 1.3570 2.3570 3.3570
3.500 1.3552 2.3552 3.3552
4.000 1.3530 2.3530 3.3530
4.500 1.3506 2.3506 3.3506