水平连接所有文件,只连接特定列

时间:2016-05-20 22:38:46

标签: linux shell gnu

在linux中,有没有办法将以.out结尾的目录中的所有文件连接到一个文件中?如果最终输出文件将它们水平地彼此相邻而不是垂直输出,那将会更好。更进一步,是否可以只从每个文件中获取第6列(每列用空格分隔)。

我知道我一直在用PowerShell做这件事。想知道linux是否可以做到这一点?

我知道我可以使用

paste *.out > total.out

但是如何粘贴第6列,用空格分隔?

2 个答案:

答案 0 :(得分:2)

将bash和awk与临时文件一起使用,以过滤每个*.out文件的第六列。

#!/bin/bash

declare -a TEMPS

for name in *.out; do
    TEMPS+=($(mktemp $name.XXXXXXXX))
    awk '{ print $5 ;}' $name >${TEMPS[-1]}
done

paste -d ' ' "${TEMPS[@]}"

# Remove tmp files
rm "${TEMPS[@]}"

使用@daniel

中的示例文件输出
6 18 30
12 24 36

答案 1 :(得分:0)

将此脚本另存为.sh文件,然后在您的目录中运行它。此方法使用sponge,您可以使用sudo apt-get install moreutils

在Ubuntu中安装

saveColumn6.sh

# Make total.out a blank file
rm total.out
> total.out
# Go through every file ending in '.out'
for i in *.out
do
  # cut out field 6, append it to total.out, and rewrite the file.
  cut -d ' ' -f6 $i | paste -d' ' total.out - | sponge total.out
done

以下是我用来测试它的输入文件。

in0.out

1 2 3 4 5 6
7 8 9 10 11 12

in1.out

13 14 15 16 17 18
19 20 21 22 23 24

in2.out

25 26 27 28 29 30
31 32 33 34 35 36

这是我收到的输出文件

total.out

 6 18 30
 12 24 36

请注意,这个新数据库中有一个领先的空间,我无法弄清楚如何摆脱它。

正如Nightcrawler所提到的,Linux不是相关组件。您正在寻找bash,这是许多基于GNU / Linux的系统使用的命令行shell。