1

我需要重复处理这个AWK 脚本,但不知道它在做什么。谁能告诉这个脚本的基本功能是什么?

它需要一个输入文件,并创建一个输出文件,但我无权访问这两个文件来查看它在做什么。它与分隔输入文件中的列的管道分隔符有关。

{ 
   if (NR == 1) {
     line = $0
     len = length(line)
       newlen = len
     while ( substr(line,newlen-1,1) == "|" )
       {
         newlen = newlen - 1
       }
     line = substr(line,1,newlen-1)
   }
     else {
     print line
     line = $0
     }
 }
 END{
      len = length(line)
      newlen = len
    while ( substr(line,newlen-1,1) == "|" ) {
      newlen = newlen - 1
    }
    line = substr(line,1,newlen-1)
      print line
}
4

3 回答 3

3

看起来它只在第一行和最后一行修剪所有尾随管道字符。

于 2011-06-06T18:12:16.913 回答
3

哇,写这篇文章的人一定是按线路付费的。

出现两次的代码块 from len = length(line)toline = substr(line,1,newlen-1)正在执行一个字符串转换,可以简单(更清楚地)表示为正则表达式替换。它正在计算|末尾的字符数line并剥离它们。当该行以除 之外的字符结尾时|,会删除一个字符(这可能是偶然的)。这可以简单地执行为gsub(/(\|+|.)$/, "", line),或者gsub(/\|+)$/, "", line)如果没有 final 的行为|无关紧要。

至于整体结构,代码分为三部分:第一行做了if (NR == 1) {…}什么( ,其他行做了什么(else {…}),最后一行之后做了什么(END {…})。在第一行,变量line设置为$0转换。在随后的行中,保存line的被打印,然后line设置为当前行。最后,最后一行被打印,转换。这种 print-previous-then-save-current 模式是在最后一行采取不同行动的常见技巧:当您阅读一行时,您无法知道它是否是最后一行,因此您保存它,打印上一行并继续前进;在END块中,您对最后一行执行不同的操作。

这就是我的写作方式。数据流同样不平凡(但也几乎没有做作),但至少它没有淹没在混乱的文本转换中。

function cleanup (line) { gsub(/(\|+|.)$/, "", line); return line }
NR != 1 { print prev }
{ prev = (NR == 1 ? cleanup($0) : $0) }
END { print cleanup(prev) }
于 2011-06-06T19:46:37.960 回答
1

我可能是错的,但快速浏览似乎过滤掉了 | 文件中的字符。

于 2011-06-06T17:24:37.153 回答