我有 69 个名为 的文件*.sites.pi
。例如,OC9.sites.pi
,cu27.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
使用cat
和awk
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