如何打印多个文件的第二列?

如何打印多个文件的第二列?

我有超过 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

相关内容