テキストを表形式に変換

テキストを表形式に変換

次の構造のテキストファイルがあります。

aaa
bbb
ccc
ddd
eee
fff

1
2
3
4
5
6

1.1
1.2
1.3
1.4
1.5
1.6

ggg
hhh
iii
jjj
kkk
lll

7
8
9
10
11
12

2.1
2.2
2.3
2.4
2.5
2.6

次の表構造が必要です。

aaa    1    1.1
bbb    2    1.2
ccc    3    1.3
ddd    4    1.4
eee    5    1.5
fff    6    1.6
ggg    7    2.1
hhh    8    2.2
iii    9    2.3
jjj    10   2.4
kkk    11   2.5
lll    12   2.6

この例では、パターンは1列に2回繰り返されますが、実際のファイルはより多く繰り返され、より多くのフィールドがあります。

答え1

paste仕事ができるはずです。x.1ファイル名です

paste <(grep -E '^[[:alpha:]]+$' x.1) \
      <(grep -E '^[[:digit:]]+$' x.1) \
      <(grep -E '^[[:digit:]]+[.][[:digit:]]+$' x.1) 

答え2

次のことができます。

mkfifo 0 1 2
awk -v RS= '{print > NR%3}' < file & paste 1 2 0

次のいずれかが該当する場合、デッドロックが発生する可能性があります。パイプバッファ(Linuxの場合64k)より大きい。

答え3

1)アルファベット、2)整数、3)浮動小数点、4)英数字の4種類のデータを考えると、次のスクリプトがawk操作を実行できます。

/^[a-zA-Z]+$/ {
    alphabets[ia++] = $1;
    n++;
}

/[a-zA-Z]+[0-9]+[a-zA-Z0-9]*/ || /[0-9]+[a-zA-Z]+[a-zA-Z0-9]*/ {
    alphanumerics[an++] = $1;
}

/[0-9]+[.][0-9]+/ {
    floats[f++] = $1;
}

/^[0-9]+$/ {
    integers[k++] = $1;
}    

END {
    for (i = 0; i < n; i++) {
        print alphabets[i], integers[i], floats[i], alphanumerics[i];
    }
}

上記のコードをファイル(たとえば)に保存し、table.awk次のように実行します。

awk -f table.awk input_text_file

特に、上記の「データ型」ブロックは、入力ファイル内の任意の順序で表示されることがあります。サンプルデータと6つの英数字の値を使用して得られた出力は次のとおりです。

aaa 1 1.1 a1
bbb 2 1.2 b2
ccc 3 1.3 c3
ddd 4 1.4 d4
eee 5 1.5 e55
fff 6 1.6 6fF
ggg 7 2.1 
hhh 8 2.2 
iii 9 2.3 
jjj 10 2.4 
kkk 11 2.5 
lll 12 2.6 

答え4

単一のTXR Lisp式、高次関数、および部分アプリケーションベースのパイプライン、固定幅フィールドの書式設定に準リテラル文字列を使用する:

$ txr -e '[(opip (partition* @1 (op where (op equal "")))
                 (tuples 3)
                 (reduce-left (op mapcar append))
                 (apply mapdo (op pprinl `@{1 6} @{2 6} @{3 6}`)))
           (get-lines)]' < data
aaa    1      1.1
bbb    2      1.2
ccc    3      1.3
ddd    4      1.4
eee    5      1.5
fff    6      1.6
ggg    7      2.1
hhh    8      2.2
iii    9      2.3
jjj    10     2.4
kkk    11     2.5
lll    12     2.6

どのように動作しますか?

一般に、全体的な表現は形を持ちます[function argument]。 is、ストリームから行を取得し(怠惰な)文字列のリストを返しますargument(get-lines)ストリームのデフォルト値はマクロで*stdin*構成され、ここですべての操作が行われます。function(opip ...)

理解するopip、私達は知らなければならないopopipこれ暗黙的に:「パイプライン」を示しますop)。また、op一部の場所では明示的に使用されます。簡単に言えば、を呼び出していくつかのパラメータを処理する匿名(op function args ...)関数を生成するための構文砂糖です。functionでは、args ...匿名関数の引数を数値として参照できます。匿名関数は暗黙的に末尾のパラメータも受け入れます。たとえば、(op + 3)引数を合計し、3 を加算する匿名関数を表します。(op - @1 3)引数から3を引く匿名関数です。この構文は、@1関数の最初のパラメータを式の指定された位置に挿入することを意味します。(op mapcar append)は、それぞれリストを含む複数のリストを渡すことができる関数です。この関数は、これらのリストをタプルにインポートして追加します。これは、データを結合するための貼り付けなどのロジックの基礎です。

このopipマクロは複数の式を取得して連結し、結果の匿名関数を介してopデータをパイプする関数を作成します。これは単純化されたものですが、そうなります。

(partition* @1 (op where (op equal "")))equal要素が空の行(空の文字列)のリストを切り取り、これらの項目を削除してファイルの元の行のリストをパーティションに分割します。 (名前にpartition1つがない関数は*これらのスペースを保持します)。

(tuples 3)このパーティションを3つのグループに分けます。

これら3つのグループまたはトリプルは、並列に一緒に累積する必要があります。トリプルの最初の要素は単一のリストに追加する必要があり、2番目の要素は単一のリストに追加する必要がある式です。それが職業です(reduce-left (op mapcar append))。カーネル関数には(op mapcar append)一対のトリプルが用意されており、それらを一緒に連結してマージされたトリプルを作成します。これreduce-leftこれにより、トリプルリストを単一のトリプルに減らします。

mapdoその後、この基本トリプルは最終式の呼び出しの引数として適用されます(apply mapdo (op pprinl ...))。次によって再生成されたmapdo関数を一番左の引数として受け取ります。(op ...)残りのパラメータは、3つのデータ列を表す巨大三重項の3つの要素です。匿名関数を介して列を行ごとにマップします。

匿名関数は、準リテラル文字列で参照される3つの引数を使用し、平均フィールド幅は6に設定されます`@{1 6} @{2 6} @{3 6}`。この文字列準リテラルは、匿名関数によって渡される3つの引数(トリプルからペアにインポートされた3つの要素)を挿入して文字列を構成し、これは改行文字として印刷します。@{1 6}@1mapdopprinl

関連情報