2017-08-29 4 views
0

私はこの問題についてかなり苦労しています(私は本当に良いbashコーダーではありません。 私は約10000のファイルを持っていますが、それぞれが同じ方法で作られています(かなり重く、約3Mb)。私は各ファイルの3行目を取得し、それらを新しいファイルに並べて貼り付けたいと思います。awkを使用して多くのファイルに列を並べて貼り付けます

私はペースト、awk、またはカットを使用して多くのソリューションを見つけましたが、ワイルドカードを扱うときにそれらのどれも機能しませんでした。私は3つのファイルがあった場合例えば、

paste <(awk '{print $3}' file1) <(awk '{print $3}' file2) <(awk '{print $3}' file3) > output 

は素晴らしい仕事だろうが、私は彼らの10000のためにそれを入力しないであろう。だから私はワイルドカードで試してみました:

paste <(awk '{print $3}' file*) > output 

そして、3行は1行にペーストします。私はいくつかのコードを試しましたが、最終的には常に同じ結果に終わります。ワイルドカードを使用してそれらを並べて貼り付ける方法はありますか?

ありがとうございました!

バティストG.

EDIT 1:schorsch312の助けを借りて、私は私のため の作品解決策を見つけました。 各列を1行として印刷し、次々と列を追加します。

for i ls files*;

を行って のawk「{のprintf $ 3iの」「} END {印刷}」$ I >>出力を行うことがなく、1 /それはかなり遅いですし、2 /それは私がタイトルに を尋ねまさにではありません、として機能します私の出力ファイルは "転置"です。実際には は私には問題ではありません。それは浮動小数点であり、後で必要に応じて をPythonで転記することができるからです。

答えて

0

私はawkだけと言っていたことは知っていますが、どうやってそれを行うのか分かりません。ここでは、あなたがしたいことをする簡単なbashスクリプトがあります。

# do a loop over all your files 
for i in `ls file*`; do 
    # use awk to get the 3rd row for all files and save output 
    awk '{print $3}' $i > row_$i 
done 

# now paste your rows together. 
paste row_* > output 

# cleanup 
rm row_* 
+0

ありがとうございました。私はそれが1ライナーの解決策ではないかどうか気にしません。しかし、この解決策は、ペーストが私が非常に多くのファイルを操作することを許可していないので、うまくいきません: > paste:row_fault_01021.xyz:開いているファイルが多すぎます –

+0

:-) forループでペーストを使用できます$ i >>出力)。出力をオーバーライドするには、>>を使用する必要があります。 – schorsch312

+0

私はそれについては、しかし、いくつかの理由でループは1回の反復の後にスタックする(何も何も計算しない)。しかし、あなたのループのアイデアで、私はいくらか働く(私の投稿を編集した)解決策を見つけました。ありがとう! –

関連する問題