ファイルの2行をマージし、行の末尾に数字を追加します。

ファイルの2行をマージし、行の末尾に数字を追加します。

次の形式の大きなテキストファイルabc.txtがあります。

BALT
-6.110
130.600
4.06874414
-0.03254425
BALT
-6.620
154.460
3.92286595
-0.17842244
BARM
32.740
140.680
3.94326190
-0.15802649

出力ファイルxyz.txtを次の形式に変換するには、このファイルが必要です。

BALT 1
 -6.110 130.600
 4.06874414
 -0.03254425
BALT 2
 -6.620 154.460
 3.92286595
 -0.17842244
BARM 3
 32.740 140.680
 3.94326190
 -0.15802649

データが多いほど、データ名の4文字の後の数字1、2、3...が増えます。

答え1

これは1行です:

# sed 's/^[A-Z]/>&/' abc.txt | awk -v RS='>' 'NR>1 {printf("%s %d\n %s %s\n %s\n %s\n",$1,NR-1,$2,$3,$4,$5)}' > xyz.txt

生成された出力は次のとおりです。

# cat xyz.txt 
BALT 1
 -6.110 130.600
 4.06874414
 -0.03254425
BALT 2
 -6.620 154.460
 3.92286595
 -0.17842244
BARM 3
 32.740 140.680
 3.94326190
 -0.15802649

詳細:

最初の部分 - 行のsed部分は各レコードの先頭にランダムな特殊文字を追加します(レコードは名前の後に4つの数字が続きます)。録音を開始するには「>」を選択しました。これにより、awkを使用した処理が簡単になります。

パート2 - 各レコードに指定した新しい形式でフィールドを印刷します。唯一の珍しいことは、先頭に追加の空のレコードがあることです。これをスキップします(NR> 1)。

答え2

2つのタスクがあります。適切な行数を計算し、出力形式を指定します。

nl -bp[A-Z] -nln abc.txt | 
sed '
     /^\w/{
           s/\(.*\)\(....\)/\2 \1/
           n
           N
           s/\n\s*/ /
          }
     s/^\s*/ /
    ' > xyz.txt

またはあなたが好きならawk

awk '
     /[A-Z]/ {
             print $0, ++count
             getline
             printf " %s", $0
             next
     }
     {
             print "", $0
     }
    ' abc.txt > xyz.txt

関連情報