我有一个大文本文件 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
随着我获取更多数据,四个字符数据名称后面的数字 1、2、3... 将会增加。
答案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 的处理变得容易。
第二部分 - 对于每条记录,只需打印您指定的新格式的字段。唯一的怪癖是开头有一个额外的空白记录 - 我们跳过它(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