在 AWK 中使用 print 时限制为 4Kbytes?

Limit of 4Kbytes when using print in AWK?

我正在尝试将一组文本文件 (*.txt) 中的空白行替换为“--”(如果前一行与某个模式匹配)。我的代码是

awk 'BEGIN{$headerfound=0} { if (/pattern/) {print> FILENAME ; $headerfound=1} else { if((/^\s*$/) && ($headerfound == 1)) { $headerfound=0; print "--" > FILENAME } else {print > FILENAME} } }' *.txt

但由于某些原因,输出限制为 4kbytes 文件(如果文件更大,则会被裁剪)。你知道限制在哪里吗?

谢谢, 爱丽儿

查看@glennjackman 对您脚本中问题的评论。

由于您使用的是 GNU awk(您使用的是特定于 gawk 的 \s),因此您可以使用就地编辑并将脚本编写为(用白色展开 space 以提高可读性) :

awk -i inplace '{
    if (/pattern/) {
        print
        headerfound=1
    } else {
        if((/^\s*$/) && (headerfound == 1)) {
            headerfound=0
            print "--"
        } else {
            print
        }
    }
}' *.txt

但是您可以更简洁地(和 awk-ishly)做同样的事情:

awk -i inplace '
    /pattern/ { headerfound=1 }
    headerfound && !NF { [=11=]="--"; headerfound=0 }
1' *.txt

如果您没有就地编辑,请按以下方式进行:

for file in *.txt; do
    awk '
        /pattern/ { headerfound=1 }
        headerfound && !NF { [=12=]="--"; headerfound=0 }
    1' "$file" > tmp$$ &&
    mv tmp$$ "$file"
done

你或许可以逃脱:

suffix=".$$.tmp" '

awk -v suf="$suffix" '
    FNR == 1 {outfile = FILENAME suf}
    /pattern/ {headerfound = 1}
    headerfound && /^[[:blank:]]*$/ { = "--"}
    { print > outfile }
' *.txt

for f in *.txt; do
    echo mv "${f}$suffix" "$f"
done

如果您对它的工作感到满意,请从 for 循环中删除 echo


错过了"just after"要求(利用Ed使用NF找空行):

awk -v suf="$suffix" '
    FNR == 1 {outfile = FILENAME suf}
    /pattern/ {lineno = FNR}
    FNR == lineno+1 && NF == 0 {[=11=] = "--"}
    { print > outfile }
' *.txt