“阅读时”和粘贴的问题

“阅读时”和粘贴的问题

我有 69 个名为 的文件*.sites.pi。例如,OC9.sites.picu27.sites.pi等。

每个文件的前缀(即 .sites.pi 之前)位于名为 的文件中ind_list

$ cat ind_list
OC9
Ocu27
...

我想将所有这些文件的第三列合并在一起。

我试过 :

while read i
do
    paste <(cut -f3 $i.sites.pi) >> output
done < ind_list

但它不起作用。我该如何让它工作?

答案1

粘贴文件时需要同时将所有元素提供给paste。由于您正在读取文件,因此您需要先将内容存储在某个地方(例如,在临时文件中),然后才能将paste它们放在一起。

所以我建议这样的事情:

i=1
while read -r file
do
    awk '{print $3}' "$file" > file.$i
    ((i++))
done < ind_list

现在您有许多file.XX包含文件第 3 列的文件。

然后,只需使用就像这样,格伦·杰克曼给我们启发

paste -d " " file.{1..69} > output

然后您可以通过说来清除所有临时文件rm file{1..69}

答案2

我没有终端来测试我的答案,所以我会尝试盲猜。

我认为

paste <(cut -f3 Ocu27.sites.pi) <(cut -f3 OS10.sites.pi) >output

paste <(cut -f3 Ocu27.sites.pi) >>output
paste <(cut -f3 OS10.sites.pi) >>output

为了解决这个问题,您可以将原始循环更改为:

while read i
do
    arguments="$arguments <(cut -f3 $i.sites.pi)"
done < ind_list
eval "paste $arguments >output"

这样做的另一个好处是,您paste只需在循环结束时执行一次,因此与在循环的每次迭代中计算粘贴相比,可以提高性能

答案3

使用catawk

cat ind_list | xargs -i'{}' awk '{print $3}' "{}.sites.pi" > output

例子

输入文件

cat OC8.sites.pi

foo bar foobar

cat OC9.sites.pi

foo bar foobar

cat Ocu27.sites.pi

foobar foo bar

cat ind_list

OC8
OC9
Ocu27

命令

cat ind_list | xargs -i'{}' awk '{print $3}' "{}.sites.pi" > output

输出文件

cat output

foobar
foobar
bar

相关内容