2017-09-07 8 views
0

私は1列の100行を持っています。このLinuxクームで行をカットして印刷する方法


line1 
line2 
line3 
. 
. 
. 
line100 

などのデータは、私はこの


line1  line11  line21 ... line91 
line2  line12  line22 ... line92 
line2  line13  line23 ... line93 
line4  line14  line24 ... line94 
. 
. 
. 
line10 line20  line30 ... line100 

のような出力は誰がどのようにこのように行うために私を助けていたいです。

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

+0

あなたの作品を見せてください。 –

+0

**本当に** line2は最初の列で繰り返され、line3はスキップされますか?そうでない場合は、例を修正してください。 –

答えて

3
pr -ts" " --columns 10 file_name 

ここで、file_nameは、変換するファイルの名前です。

0

あなたはrsを使用することができます。

$ seq 30 | rs 0 4 
1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 
17 18 19 20 
21 22 23 24 
25 26 27 28 
29 30 

あなたはラインは全体の対ダウンしたい場合:列値のそれぞれに1列を転置

$ seq 30 | rs 4 0 | rs -T 
1 9 17 25 
2 10 18 26 
3 11 19 27 
4 12 20 28 
5 13 21 29 
6 14 22 30 
7 15 23 
8 16 24 
0

。行列10x10のように聞こえます。単一
スクリプトgawkは:

awk -v d=10 'NR==1{ c=1 } 
    { a[c][++k]=$0; if(!(NR%d)){ c++; k=0 } } 
    END{ 
     for(i=1;i<=d;i++) 
      for(j=1;j<=c;j++) printf "%s%s",a[j][i],(j==c)? ORS:FS 
    }' file 

  • -d=10 - devisor /係数を、それが列ごとに行

の最大数を指定することができます出力: ここ

line1 line11 line21 line31 line41 line51 line61 line71 line81 line91 
line2 line12 line22 line32 line42 line52 line62 line72 line82 line92 
line3 line13 line23 line33 line43 line53 line63 line73 line83 line93 
line4 line14 line24 line34 line44 line54 line64 line74 line84 line94 
line5 line15 line25 line35 line45 line55 line65 line75 line85 line95 
line6 line16 line26 line36 line46 line56 line66 line76 line86 line96 
line7 line17 line27 line37 line47 line57 line67 line77 line87 line97 
line8 line18 line28 line38 line48 line58 line68 line78 line88 line98 
line9 line19 line29 line39 line49 line59 line69 line79 line89 line99 
line10 line20 line30 line40 line50 line60 line70 line80 line90 line100 
1

あなたも一度のawkを以下試してくださいでした別の1

$ printf "%s\n" line{1..100} | pr -10t 

line1 line11 line21 line31 line41 line51 line61 line71 line81 line91 
line2 line12 line22 line32 line42 line52 line62 line72 line82 line92 
line3 line13 line23 line33 line43 line53 line63 line73 line83 line93 
line4 line14 line24 line34 line44 line54 line64 line74 line84 line94 
line5 line15 line25 line35 line45 line55 line65 line75 line85 line95 
line6 line16 line26 line36 line46 line56 line66 line76 line86 line96 
line7 line17 line27 line37 line47 line57 line67 line77 line87 line97 
line8 line18 line28 line38 line48 line58 line68 line78 line88 line98 
line9 line19 line29 line39 line49 line59 line69 line79 line89 line99 
line10 line20 line30 line40 line50 line60 line70 line80 line90 line100 
+0

他の 'pr'ソリューションとは異なり、これはPOSIXで動作します。 – dawg

0

です。

awk -v col=10 ' 
{ 
    a[FNR]=$0 
} 
END{ 
    for(i=1;i<=col;i++){ 
    for(j=0;j<=FNR;j=j+col){ 
     printf("%s%s",a[i+j],j==FNR?"":" "); 
} 
    print "" 
} 
} 
' Input_file 

説明: だからここに私が値(私たちは、印刷したい列の数を表す)10でCOLという名前の変数を作成しました。次に、インデックスがFNR(現在の行の値)で、valueが現在の行の値である、aという名前の配列を作成しています。今度はawkのENDブロックで、変数iから値1までのcolの値(この場合は最大10まで)を開始するforループを開始してから、変数jの値0から開始するinner forループを開始しますFNRの値(Input_file内の行の総数)と値が10ずつ増加するたびに、配列inner []の値が配列[i + j]に出力されるので、 1]、a [11]、a [21] ..... etc etc次に2番目の文字列は、これらの配列の値の間にスペースを入れて、最後の要素であるかどうかを確認してください。今では外側のforループ印刷のヌル値で、ここに新しい行が印刷されます。

関連する問題