n 列ごとに新しい行を開始するには?

n 列ごとに新しい行を開始するには?

したがって、長さが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から文字列のペアを蓄積できます$2NR必要な行サイズがモジュールとして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 '~' ' '

関連情報