awk(或sed/python)跳过行以对列重新编号

2024-05-23 13:35:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要帮助重新编号元素。我有一个类似下面的小示例的输入文件(节点和元素可能在1000中)。我需要一个代码,它跳过所有节点,从第一个元素开始,然后我需要向所有元素添加一个整数。即:元素658=1658、659=1659等。。。。 所有内容都需要输出到一个新文件中,唯一的区别是元素的重新编号。 我试着用awk命令来做这件事,代码如下,不太明白。有人能帮忙吗?python还是sed更好?谢谢

*NODE, NSET=Nvolc
   1,6.106226635438e-16,0.000000000000e+00,1.000000000000e+01
   2,6.106226635438e-16,0.000000000000e+00,-1.000000000000e+01
   3,5.481726184087e-16,0.000000000000e+00,9.000000000000e+00
*ELEMENT, TYPE=C3D4, ELSET=Evolc
   658,    58,   193,   148,   113 
   659,   154,    81,   215,   119 
   660,   228,    58,   148,    36 
   661,     7,   131,   146,   302 

代码:

    awk 'NR==1{print}' test.msh > test2.msh | nawk -v number=500 'NR <= 2 { next } BEGIN{FS=OFS=","} {$1=number;print;number++;print}' test.msh > test2.msh

Tags: 文件代码test元素示例number内容节点
2条回答

您可以使用sed中的address range来执行此操作:

sed '/ELEMENT/,$s/^   \([0-9]\)/   1\1/' test.msh

范围/ELEMENT/,$意味着从“ELEMENT”的第一次出现到文件的结尾进行搜索。剩下的只是一个简单的substitutionback reference,假设您的空格是一致的。你知道吗

重读你的问题,你不清楚你是想改变所有的数字,还是只改变每行的第一个。如果要全部替换,则应该这样做:

sed '/ELEMENT/,$s/ \([0-9]\)/ 1\1/g' test.msh
awk digit=1 \
    'adjust    { $1 = digit $1 } \
     /ELEMENT/ { adjust = 1 } \
               { print }'

如果正在调整,则将digit连接到第一个元素。当ELEMENT出现在行上时启用调整。打印所有内容。你知道吗

相关问题 更多 >