こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Unixのコマンドについて

Windows上で、cygwinを動かしています。
50行から成るテキストファイルが50個あります。各ファイルの各行を取りだして、1つのファイルにまとめるにはどのようなコマンドを使えばできますか?
例でいうと下記のようになります。ファイルAとファイルBからファイルCを作成したいです。

[ファイルA]   [ファイルB]
1行目      1行目
2行目      2行目
3行目      3行目
・・・        ・・・

[ファイルC]
ファイルAの1行目
ファイルBの1行目
・・・


ご教授いただければ幸いです。よろしくお願いします。

投稿日時 - 2011-09-08 12:55:26

QNo.6997382

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

#4です。
ごめんなさい。質問の意味を間違えていました。
以下の1行で済みます。

$awk '(max<FNR){max=FNR}{L[FNR]=sprintf("%s%s\n",L[FNR],$0)}END{for(i=1;i<=max;i++)printf L[i]}' {ファイルA} {ファイルB} .... > {ファイルC}

awk の中の詳細は以下のとおり

(max<FNR){max=FNR} #最大行を保存する

{L[FNR]=sprintf("%s%s\n",L[FNR],$0)} #L[行] の配列に各ファイルの行を保存する

END{
for(i=1;i<=max;i++)printf L[i] #最後にLの配列の中身を順に表示する。
#print ではなく printf を使用するのは改行を表示させないため。
}

投稿日時 - 2011-09-10 13:09:44

ANo.5

入力ファイルにタブ文字が含まれていなくて、かつ
$ echo *
の結果の順番が処理すべきファイルの順番で、そのままコマンドラインに使えるなら、
$ paste * | tr "\t" "\n" >結果ファイル
でいけると思います。
ファイル名が長すぎたり、入力にタブが入っている場合は下処理が必要ですね。

o ファイル名が長すぎる場合
例えば5分割して処理します。10ファイルずつファイル名を書いたリストファイルを作って、
$ xargs -a リストファイル1 paste >途中結果ファイル1
...
$ xargs -a リストファイル5 paste >途中結果ファイル5
($ for n in {1..5}; do xargs -a リストファイル$n paste >途中結果ファイル$n; done)
$ paste 途中ファイル* | tr "\t" "\n" >結果ファイル

o 入力にタブ文字がある場合
入力ファイル中のタブ文字を変換しておいて、あとで戻す。
$ cat 入力ファイル1 | tr "\t" "\000" >一時ファイル1
...
$ paste 一時ファイル* | tr "\t\000" "\n\t" >結果ファイル

投稿日時 - 2011-09-08 20:13:03

ANo.4

30秒で作ったので、確認はご自分でお願いいたします。
$awk '{print $0 > "out-"FNR".TXT";}' {ファイルA} {ファイルB}...

out-1.TXT, out-2.TXT のファイル名で 1行目のファイル、2行目のファイルになります。
001等にしたいならば、print の前でファイル名を生成してください。

投稿日時 - 2011-09-08 19:58:30

ANo.3

・ファイルAの各行の行頭に行番号をつけたファイルAAを作る
(ファイルの行頭に空白がないならcat -n A > AA 、あるならawkで行番号+特殊文字)
・同様にしてファイルBBを作る
・cat AA BB でマージした結果 を、sort -n で行番号順に並べ替えたあとで、行頭の行番号をsedで削除する
って感じいけるのでは。

投稿日時 - 2011-09-08 14:19:49

ANo.2

そんなことをするコマンドはないので, 自分で作ってください.

投稿日時 - 2011-09-08 13:34:30

ANo.1

ファイルAとファイルBの行数が同じと仮定し、全く考えていないシェルですが・・・

シェルを行数の回数だけ繰り返すとfileC1...FileC(n)ができる。
-----
cat fileA | head -1 > fileC1
cat fileB | head -1 >> fileC1
----
*fileC(n)を手動で変える必要ありますが ^ ^;

投稿日時 - 2011-09-08 13:32:09

あなたにオススメの質問