3

我有来自标准输出的数据列(在我的情况下是对 mysql 的调用),我想在每个循环中附加文件中的列。我能怎么做?

Standard output:

 a1
 a2
....
 an

保存在名为 table.dat 的文件中:

table.dat:

 a1
 a2
....
 an

然后产生另一个输出:

Further standard output:

 b1
 b2
....
 bn

附加到 table.dat:

table.dat:

 a1   b1
 a2   b2
.... ....
 an   bn

...等等。我可以使用粘贴,但我需要三个步骤:

 line producing standard output > tmpfile;
 paste prevfile tmpfile > table
 mv table prevfile;

有没有更快的方法,也许是使用 awk?

此解决方案: 向文件添加新列 会生成一个空表。

4

2 回答 2

6

您可以通过从标准输入读取来使用这样的粘贴:

paste <(command1) <(command2)

例如

paste <(cat f1) <(cat f2)

代替:

paste f1 f2
于 2013-11-05T19:14:22.913 回答
2

只是为了澄清在给出两个流的情况下的一些细节,没有相同数量的元素。结果与paste anubhava 建议的一样

[ ~]$ cat t1.txt 
a1
a2
a3
[ ~]$ cat t2.txt 
b1
b2

[ ~]$ paste t1.txt t2.txt 
a1  b1
a2  b2
a3

否则,使用 Bash 只是为了好玩:

[ ~]$ cat test.sh 
#!/bin/bash

f1=t1.txt
f2=t2.txt

getNumberOfRows(){
    wc -l "$1"|cut -d" " -f1
}

s1=$(getNumberOfRows "$f1")
s2=$(getNumberOfRows "$f2")
[[ $s1 -le $s2 ]] && min="$s1" || min="$s2"

i=1
while read; do
    echo "$REPLY $(sed -n ${i}p $f2)"
   (( i++ ))
   [[ $i -ge $min ]] && break
done < "$f1"

[ ~]$ ./test.sh 
a1 b1
a2 b2
[ ~]$

在此示例中,您可以看到如果文件大于另一个文件,我们不会显示额外的行。

当然,您可以通过此脚本中的命令输出paste或使用此脚本来更改文件;)

使用paste

paste <(COMMAND1) <(COMMAND2)

使用脚本:请参阅此答案以了解如何在循环中读取命令输出。

于 2013-11-05T19:54:56.193 回答