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

...等々。ペーストを使用できますが、次の 3 つの手順が必要です。

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

おそらくawkを使用して、より速い方法はありますか?

この解決策: ファイルに新しい列を追加すると 、空のテーブルが生成されます。

4

2 に答える 2

2

指定された 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 に答える