次の形式の大きなテキストファイル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