“边读边”粘贴问题


0

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

但这是行不通的。我该如何运作?


你说合并是什么意思?并排打印所有列还是一个接一个打印?您当前正在粘贴一件事,这没有多大意义。
fedorqui

是的,我要并排打印列。
user236152

您的命令在循环外是否具有预期的行为?即是paste <(cut -f3 OC9.sites.pi) >> output正确的?
阿瑟雷

是的,它有效!问题来自while读取循环...
user236152

我可以那样做,并且可以正常工作:paste <(cut -f3 Ocu27.sites.pi) <(cut -f3 OS10.sites.pi) <(cut -f3 OC9.sites.pi) > output但是写69次“ <(cut -f3 OC9.sites.pi)”部分实在是太烦人了!
user236152

Answers:


4

粘贴文件需要同时将所有元素都指定给paste。由于正在读取文件,因此需要首先将内容存储在某个位置(例如,在临时文件中),以便可以将paste它们一起存储。

所以我建议像这样:

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

现在,您在file.XX文件的第三列中有许多文件。

然后,只要使用类似这样的东西,格伦·杰克曼就会启发我们

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

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


非常感谢它的工作!只需更改file{1..69}file.{1..69}
user236152

1
@ user236152很高兴读到!记住,您可以接受任何可以帮助您解决问题的答案(我都很喜欢!)
fedorqui 2015年

1

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

我认为两者之间的行为可能有所不同

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在循环结束时只执行一次,因此与在循环的每次迭代中计算粘贴相比,性能可能有所提高


1
我喜欢这种解决方案,+ 1。我可能会用它args=$(awk '{printf "<(cut -f3 %s) ", $1})' ind_list来创建一个更漂亮的字符串。
fedorqui

@fedorqui同意,这awk看起来比循环还

在一般情况下,当大约只是单独处理文本,awksed足够了。我使用bash的循环,如果我要进行额外的东西,比如调用外部命令,等等
fedorqui

0

使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.