2016-12-19 10 views
0

私は、awkを使って3つのファイルの内容をシャッフルし、余分な行にテキストを4行目として追加する短いbashスクリプトを書きたいと考えています。例えば:awkを使ってテキストファイルをシャッフルする

ファイル1:

one.0 
one.1 
one.2 
one.3 

ファイル2:

two.0 
two.1 
two.2 
two.3 

ファイル3:

three.0 
three.1 
three.2 
three.3 

の望ましい結果:あなたの助けを

one.0 
two.0 
three.0 
sometext 
one.1 
two.1 
three.1 
sometext 
one.2 
two.2 
three.2 
sometext 
one.3 
two.3 
three.3 
sometext 

ありがとう!

+0

あなたが本当にシャッフル(ランダムな順序に並べ替え)、または実行を意味しますあなたはマージを意味しますか?余分なテキストはどこから来るのですか?スクリプトはランダムなテキストを生成するはずですか?ファイルは常に同じ数の行を持っていますか?そうでなければ、出力は何ですか? –

+0

カード・プレイでは、これは完璧なシャッフルと呼ばれますが、より適切な用語はインターリーブであると思います。 – karakfa

+0

説明していただきありがとうございます。私はこの質問を見るときに何を探すべきかと苦労していました。誰かが正確な用語を知っていれば、それはすばらしいことになります。完璧なシャッフル?インターリーブ?マージ? – ericstevens26101

答えて

1

このawkのコードはつもりあなたがやりたいことされています

getlineを使用してawkでは
awk 'f!=FILENAME{++idx;f=FILENAME}{a[idx][FNR]=$0} 
    END{rows=length(a[1]) 
    for(r=1;r<=rows;r++){ 
     for(i=1;i<=idx;i++) { 
      print a[i][r] 
     } 
     print "sometext" 
    } 
}' f1 f2 f3 
+0

これは素晴らしい解決策のようです。上記のソリューションよりも少し複雑に思えます。効率は私がやっていることにおいて重要です。上記のコードと比べてすぐにこれが実行されるとコメントできますか? – ericstevens26101

5
$ cat a 
a0 
a1 
a2 
a3 

$ cat b 
b0 
b1 
b2 
b3 

$ cat c 
c0 
c1 
c2 
c3 

$ paste -d '\n' a b c | awk '1; NR % 3 == 0 {print "some text"}' 
a0 
b0 
c0 
some text 
a1 
b1 
c1 
some text 
a2 
b2 
c2 
some text 
a3 
b3 
c3 
some text 
+0

スマート。おそらく、バリエーションは 'paste ... | sed '3〜3asome text'' – karakfa

+0

これは素晴らしい解決策のようです。短く効果的です。効率は私がやっていることにおいて重要です。これはすぐに下記のコードと比較して実行されることにコメントできますか? – ericstevens26101

+0

ericstevens26101では、意味のあるタイミング結果を得て、それぞれの環境でどのように動作するかを確認するのに十分な大きさのテストデータセットで試してみることをお勧めします。そして、 'sed'を使って@karakfaの非常にエレガントな選択肢を試してみてください。そして今、あなたはJames Brownのall-awkの選択肢を持っています。ファイルが非常に大きい場合、Kentの解決策はすべてをメモリに読み込むことから始まることに注意するのは良いことです。あなたが発見したものをお知らせください! – jas

0

ワン:

$ awk 'BEGIN { 
      while((getline line < ARGV[i+1]) >0) { # read from file refering ARGV 
       i=++i%(ARGC-1);      # ARGV iteration 
       print line (i?"":"\nsome text")  # print line and "some text" when needed 
      } 
     }' f1 f2 f3 
one.0 
two.0 
three.0 
some text 
one.1 
two.1 
three.1 
some text 
one.2 
two.2 
three.2 
some text 
one.3 
two.3 
three.3 
some text 
関連する問題