我需要复制此 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
}
答案 0 :(得分:3)
看起来它只修剪了第一行和最后一行的所有尾随管道字符。
答案 1 :(得分:3)
从len = length(line)
到line = substr(line,1,newlen-1)
发生两次的代码块正在进行字符串转换,可以简单地(并且更清楚地)表示为正则表达式替换。它正在计算|
末尾line
个字符的数量并将其剥离。当行以|
以外的字符结尾时,一个字符被剥离(这可能是偶然的)。如果没有最终gsub(/(\|+|.)$/, "", line)
的行为无关紧要,可以简单地以gsub(/\|+)$/, "", line)
或|
执行此操作。
至于整体结构,代码中有三个部分:对第一行做了什么(if (NR == 1) {…}
,为其他行做了什么(else {…}
),以及在最后一行之后做了什么(END {…}
)。在第一行,变量line
设置为$0
已转换。在后续行中,打印已保存的line
,然后line
为设置为当前行。最后打印,转换最后一行。这个打印前一个然后保存当前模式是在最后一行采取不同行为的常见技巧:当你读一行时,你不知道是否它是最后一个,所以你保存它,打印上一行并继续前进;在END
块中,你为最后一行做了不同的事情。
这是我写的方式。数据流同样非常重要(但也很难设计),但至少它并没有淹没在凌乱的文本转换中。
function cleanup (line) { gsub(/(\|+|.)$/, "", line); return line }
NR != 1 { print prev }
{ prev = (NR == 1 ? cleanup($0) : $0) }
END { print cleanup(prev) }
答案 2 :(得分:1)
我可能错了,但快速浏览它似乎过滤掉了文件中的文字。