次の構造のテキストファイルがあります。
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
、私達は知らなければならないop
、opip
これ暗黙的に:「パイプライン」を示します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
要素が空の行(空の文字列)のリストを切り取り、これらの項目を削除してファイルの元の行のリストをパーティションに分割します。 (名前にpartition
1つがない関数は*
これらのスペースを保持します)。
(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}
@1
mapdo
pprinl