したがって、長さが20,000の「列」で長さが2行のテキストファイルがあります。データは次のとおりです。
FP1 amp FP1 lat FP2 amp FP2 lat FP3 amp FP3 lat AF1 amp AF1 lat
4.1 231 2.2 232 1.3 233 4.4 234
120列の列ごとに、ヘッダー値が2行目の異なる値で繰り返されます。 120列ごとにこれらの「列」を分割し、新しい行を開始してファイルの最後まで続行するにはどうすればよいですか?
答え1
データを転置するためにBSDを使用するとしますrs
。
$ rs -T
a b c d e f g h
1 2 3 4 5 6 7 8
[Ctrl-D][Enter]
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
これで扱いやすい2つの長い列で構成されていますawk
。データをスキャンして$1
から文字列のペアを蓄積できます$2
。NR
必要な行サイズがモジュールとして0の場合は、累積文字列を出力します。
$ awk '{ hdrs = (hdrs ? hdrs OFS $1 : $1);
vals = (vals ? vals OFS $2 : $2); }
!(NR % 3) { print hdrs; print vals;
hdrs = vals = "" }
END { print hdrs; print vals; }'
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
[Ctrl-D][Enter]
a b c
1 2 3
d e f
4 5 6
g h
7 8
このような他の出力形式(一貫したパターンで別々にラップされたヘッダーと値)が必要な場合は、Awkコードからそれらを削除することは難しくありません。
a b c
d e f
g h
1 2 3
4 5 6
7 8
実際のデータは、フィールドヘッダーが複数のスペースで区切られ、それ自体がスペースを含むために混乱します。
フィールドに内部スペースが 1 つだけ含まれており、常に複数のスペースで区切られていると仮定すると、データを前処理して内部スペースを空白以外の文字 (まだデータに存在しない) に置き換えます (たとえば、チルダ)。 (~
)。たとえば、Sedを使用している場合:
$ sed -e 's/\([^ ]\) \([^ ]\)/\1~\2/g'
foo bar xyzzy quux alpha beta gamma delta
[Ctrl-D][Enter]
foo~bar xyzzy~quux alpha~beta gamma delta
再フィルタリングするのは簡単です。
tr '~' ' '