打印文件包含单个令牌的上一行后,现在需要遍历结果以满足要求

打印文件包含单个令牌的上一行后,现在需要遍历结果以满足要求

我使用下面的代码来打印文件包含单个标记的前一行

#! /bin/ksh

file=input.txt
while read line
do
awk 'NF == 1 { print LAST } { LAST=$0 }'
done < "$file"

现在我需要遍历结果,并需要检查第 9 个位置、第 11 个位置、第 13 个位置等,直到行尾具有连续的奇数位置,以及这些位置是否与任何提到的数字都不匹配:

201 
230 
197 
193 
229 
200 
215 
226 
001 
198 

它应该将错误打印为CORRUPTED,否则AVAILABLE应该打印。

这是我的文件的示例:

59 6 18 2014 169 7 14 2 7671912 7849744 201 4
60 6 19 2014 170 5 49 2 7671912 7849744 201 5
61 6 20 2014 171 6 8 2 7671912 7849744 201 6
62 6 23 2014 174 5 3 2 7671912 7849744 201 7
63 6 23 2014 174 7 17 2 7671912 7849744 201 8
64 6 24 2014 175 16 13 2 7671912 7849744 201 9
65 6 25 2014 176 8 20 2 7671912 7849744 201 10
10
1 1 49 6 16 2014 7 39 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 2 49 6 17 2014 13 15 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 3 49 6 18 2014 1 38 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 4 49 6 18 2014 7 14 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 5 49 6 19 2014 5 49 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871

如果我们以此为例,第 9 位是 7671912

注意:该代码在任何其他文件中也应该可行。

答案1

尝试这个:

$ echo "65 6 25 2014 176 8 20 2 7671912 7849744 201 10" |
awk 'FNR == NR { a[$1]; next }
     {
         for (i = 9; i <= NF; i += 2) {
             if (!($i in a)) {
                 flag = 1;
             }
          }
          if (flag) {
              print "CORRUPTED";                  
          } else {
              print "AVAILABLE";                  
          }
     }
' file -
CORRUPTED

file包含所有要比较的数字。您必须echo "65 6 25 2014 176 8 20 2 7671912 7849744 201 10"从此测试中替换为打印文件包含单个标记的上一行的脚本。

解释

  • FNR == NR { a[$1]; next }:在处理时file,我们将每个数字保存file到一个数组中a
  • 读取后file,我们从 field 开始循环遍历所有奇数字段9th,如果字段值不在 array 中a,则设置flag = 1
  • 最后,如果flag设置为 1,这意味着我们至少有一个字段的值不在 中file,因此我们打印CORRUPTED,否则打印AVAiLABLE

相关内容