9

すべての数値が 1 つの列に配置されているが、 n (幅) x m (高さ)の強度行列を表す科学データがあるとします。入力ファイルの列には合計n * m行があります。入力例は次のようになります。

1  
2  
3  
......  
30 

新しい出力は、 m行のn 個の新しい列を持つようにする必要があります。30 フィールドの入力とn = 3、m = 10 の例に固執すると、次のような出力ファイルが必要になります (区切り記号はあまり重要ではなく、空白、タブなどである可能性があります)。

1   11  21  
2   12  22  
... ... ...
10  20  30 

私は Windows で gawk を使っています。FS特別な はなく、より現実的な例は 60 * 60 以上のようなものであることに注意してください。

4

4 に答える 4

15

awkGNUコアユーティリティ(cygwin、ネイティブなど)に限定されていないが、持っている場合、最も簡単な解決策は次を使用することprです:

pr -ts" " --columns 3 file
于 2013-03-29T14:01:43.590 に答える
3

これでうまくいくと思います:

awk '
  { split($0,data); }
  END {
     m = 10;
     n = 3;
     for( i = 1; i<=m; i++ ) {
        for( j = 0; j<n; j++ ) {
            printf "%s ", data[j*m + i] # output data plus space in one line
        }
        # here you might want to start a new line though you did not ask for it:
        printf "\n"; 
     }
  }' inputfile

インデックスのカウントが間違っている可能性がありますが、理解できると確信しています。トリックはsplit最初の行にあります。入力を空白で分割し、配列を作成しますdataENDブロックはファイルの処理後に実行さdataれ、インデックスでアクセスするだけです。配列のインデックスは 0 からカウントされることに注意してください。

すべてのデータが 1 行にあると仮定します。あなたの質問はこれについて明確ではありません。複数の行にある場合は、別の方法で配列に読み込む必要があります。

これで始められることを願っています。

編集 私が回答している間に質問を変更したことに気付きました。だから変える

{ split($0,data); }

{ data[++i] = $1; }

入力が異なる行にあることを考慮します。実際、これにより、最初にそれを 2 次元配列に読み込むオプションが与えられます。

編集2

2 次元配列 を読み取る 2 次元配列として読み取るには、m事前nに既知であり、何らかの形で入力にエンコードされていないと仮定します。

awk '
  BEGIN {
     m = 10;
     n = 3;
  }
  { 
     for( i = 0; i<m; i++ ) {
        for( j = 0; j<n; j++ ) {
            data[i,j] = $0;
        }
     }
     # do something with data
  }' inputfile

ただし、データを再フォーマットしたいだけなので、すぐに実行できます。2 つのソリューションを組み合わせて、コマンド ラインで取り除き、data渡します。mn

awk -v m=10 -v n=3'
  { 
     for( i = 0; i<m; i++ ) {
        for( j = 0; j<n; j++ ) {
            printf "%s ", $0     # output data plus space in one line
        }
        printf "\n";
     }
  }' inputfile
于 2013-03-28T17:27:24.897 に答える
2

以下のコマンドを使用できます

paste - - - < input.txt

デフォルトでは、区切り文字は TAB です。区切り文字を変更するには、以下のコマンドを使用します

paste - - - -d' ' < input.txt
于 2016-03-07T06:49:56.457 に答える
2

これはかなり単純な解決策です (例ではn3 に設定しました。 に適切な値を差し込んでnください)。

awk -v n=3 '{ row = row $1 " "; if (NR % n == 0) { print row; row = "" } }' FILE

これは、一度に 1 行ずつレコードを読み込み、各行を前の行と連結することによって機能します。n行が連結されると、連結された結果が 1 つの新しい行に出力されます。これは、入力に残っている行がなくなるまで繰り返されます。

于 2013-04-05T11:06:36.687 に答える