Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
If statement 带断开状态的回路AWK_If Statement_For Loop_Awk_Break - Fatal编程技术网

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:-)