在AWK中使用打印时限制为4K字节?

时间:2015-02-09 15:51:44

标签: printing awk wildcard

如果前一行与模式匹配,我正在尝试将一组文本文件(* .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文件(如果文件较大,则会被剪裁)。你知道这个限制在哪里吗?

谢谢, 阿里尔

2 个答案:

答案 0 :(得分:3)

请参阅@ glennjackman对脚本中问题的评论。

由于您使用的是GNU awk(您使用了特定于gawk的\s),您可以使用inplace-editing并将脚本编写为(使用空格展开以提高可读性):

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 { $0="--"; headerfound=0 }
1' *.txt

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

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

答案 1 :(得分:1)

你可以逃脱:

suffix=".$$.tmp" '

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

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

如果您对其工作满意,请从for循环中移除echo


在"之后错过了#34;要求(使用Ed使用NF查找空行):

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