合并文件的两行并在行尾添加数字

合并文件的两行并在行尾添加数字

我有一个大文本文件 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

相关内容