If statement 带断开状态的回路AWK
今天,我正在解决一个问题,即纠正文件中有一些未知项的数据错误。未知数是每个文件中的字段数,以及哪些字段和记录具有字符串“---” 数据的一个例子是:If statement 带断开状态的回路AWK,if-statement,for-loop,awk,break,If Statement,For Loop,Awk,Break,今天,我正在解决一个问题,即纠正文件中有一些未知项的数据错误。未知数是每个文件中的字段数,以及哪些字段和记录具有字符串“---” 数据的一个例子是: 1 2 1 39.6406 1 38.8512 1 38.3479 1 37.9744 2 1 4 39.1527 3 38.7329 2 38.3479 2 37.9744 3 3 3 39.5186 2 38.8512 3 38.2079 3
1 2 1 39.6406 1 38.8512 1 38.3479 1 37.9744
2 1 4 39.1527 3 38.7329 2 38.3479 2 37.9744
3 3 3 39.5186 2 38.8512 3 38.2079 3 37.6385
4 4 2 39.6406 4 38.4964 --- 37.7414 --- 36.7149
5 5 --- 40.2504 --- 39.0286 --- 38.4879 --- 38.1004
所需输出为:
1 2 1 39.6406 1 38.8512 1 38.3479 1 37.9744
2 1 4 39.1527 3 38.7329 2 38.3479 2 37.9744
3 3 3 39.5186 2 38.8512 3 38.2079 3 37.6385
4 4 2 39.6406 4 38.4964 --- --- --- ---
5 5 --- --- --- --- --- --- --- ---
我已尝试使用for循环,例如:
awk '{for (i = NF; i >= 1; i--){if ($i=="---")$(i-1)="---"}{print $0}}' file
这导致:
1 2 1 39.6406 1 38.8512 1 38.3479 1 37.9744
2 1 4 39.1527 3 38.7329 2 38.3479 2 37.9744
3 3 3 39.5186 2 38.8512 3 38.2079 3 37.6385
---
---
我也试过:
awk '{for (i=1;i<=NF;i++){if ($i=="---")$(i+1)="---"}{print $0}}' file
在我的第一次尝试中,for循环一直到第一个字段,在第二次尝试中,具有所需字符串的记录有一个无限循环
我的直觉是我需要应用一个中断语句,但经过几个小时的搜索,我找不到一个对我有帮助的例子。我知道剥猫皮的方法不止一种,因此,如果您知道更好的方法来实现我的目标,请记住有多个具有不同字段计数的文件,或者如果您可以使用我的一个for循环提供break语句示例,我和其他正在寻找示例的人将非常感激
谢谢这应该行得通
$ awk '{for(i=3;i<NF;i+=2) if($i=="---") $(i+1)=$i}1' file |
column -t
1 2 1 39.6406 1 38.8512 1 38.3479 1 37.9744
2 1 4 39.1527 3 38.7329 2 38.3479 2 37.9744
3 3 3 39.5186 2 38.8512 3 38.2079 3 37.6385
4 4 2 39.6406 4 38.4964 --- --- --- ---
5 5 --- --- --- --- --- --- --- ---
$awk'{for(i=3;i这应该行得通
$ awk '{for(i=3;i<NF;i+=2) if($i=="---") $(i+1)=$i}1' file |
column -t
1 2 1 39.6406 1 38.8512 1 38.3479 1 37.9744
2 1 4 39.1527 3 38.7329 2 38.3479 2 37.9744
3 3 3 39.5186 2 38.8512 3 38.2079 3 37.6385
4 4 2 39.6406 4 38.4964 --- --- --- ---
5 5 --- --- --- --- --- --- --- ---
$awk'{for(i=3;i您所需要的只是一个简单的替换,因此这是sed的理想工作:
$ sed -E 's/(-+ +)[^ ]+/\1\1 /g' file
1 2 1 39.6406 1 38.8512 1 38.3479 1 37.9744
2 1 4 39.1527 3 38.7329 2 38.3479 2 37.9744
3 3 3 39.5186 2 38.8512 3 38.2079 3 37.6385
4 4 2 39.6406 4 38.4964 --- --- --- ---
5 5 --- --- --- --- --- --- --- ---
您所需要的只是一个简单的替代品,因此这是sed的理想工作:
$ sed -E 's/(-+ +)[^ ]+/\1\1 /g' file
1 2 1 39.6406 1 38.8512 1 38.3479 1 37.9744
2 1 4 39.1527 3 38.7329 2 38.3479 2 37.9744
3 3 3 39.5186 2 38.8512 3 38.2079 3 37.6385
4 4 2 39.6406 4 38.4964 --- --- --- ---
5 5 --- --- --- --- --- --- --- ---
我看到的一个问题是,在每次迭代中,索引没有增加/减少两个重叠范围。我看到的一个问题是,在每次迭代中,索引没有增加/减少两个重叠范围。谢谢,我将把它添加到我的grimoire:-)谢谢,我将把它添加到我的grimoire:-)