【问题标题】:AWK Script - What does this script do?AWK 脚本 - 这个脚本有什么作用?
【发布时间】:2011-06-07 03:46:37
【问题描述】:

我需要重复处理这个 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
}

【问题讨论】:

    标签: unix awk gawk


    【解决方案1】:

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

    【讨论】:

    • 好的,这是有道理的,我想 BCP 进程正在创建无关的管道字符。非常感谢。
    【解决方案2】:

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

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

    关于整体结构,代码分为三部分:第一行做了什么(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) }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我也是这么想的......你认为它是完全删除角色还是留下空白?它正在使用一个分隔的数据库文件(来自 sybase 的 bcp),所以我认为他们正在删除分隔符。可能删除标题记录??
      猜你喜欢
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      相关资源
      最近更新 更多