Printing 在AWK中使用打印时的4KB限制?

Printing 在AWK中使用打印时的4KB限制?,printing,awk,wildcard,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 > FILENAM

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

谢谢,
Ariel

请参阅@glennjackman的评论,了解脚本中存在的问题

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

但是你可以做同样的事情,做得更简洁(也更笨拙),比如:

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

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

有关脚本中的问题,请参阅@glennjackman的评论

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

但是你可以做同样的事情,做得更简洁(也更笨拙),比如:

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

for file in *.txt; do
    awk '
        /pattern/ { headerfound=1 }
        headerfound && !NF { $0="--"; 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:]]*$/ {$1 = "--"}
    { print > outfile }
' *.txt

for f in *.txt; do
    echo mv "${f}$suffix" "$f"
done
如果您对for循环的
回音工作满意,请将其从for循环中删除


错过了“紧随其后”的要求(使用教育署的
NF
查找空行):


您可能会侥幸逃脱:

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循环的
回音工作满意,请将其从for循环中删除


错过了“紧随其后”的要求(使用教育署的
NF
查找空行):


在读取文件时写入文件会导致灾难。通常,您会写入临时文件,并在处理完该文件后将该临时文件移动到“真实”文件。不要对awk变量使用
$
$
是一个运算符,用于获取由变量(或表达式)命名的字段的值,该变量仅根据Glen的答案,。。我需要在一个模式结束后替换一个空行,所以我提出了下面修改过的代码,当然没有响应那么优雅,但它的工作方式是suffix=“.$$.tmp”awk-v suf=“$suffix”'FNR==1{outfile=FILENAME suf}{if(/pattern/){headerfound=1}else if(headerfound&/[:blank:]*$/){$1=“--”headerfound=0}否则{headerfound=0}}{print>outfile}'*.txt代表*.txt中的f;执行mv“${f}${suffix}”“$f”在读取文件时不写入文件会导致灾难。通常,您会写入临时文件,并将该临时文件移到“real”位置处理完文件后返回文件。不要对awk变量使用
$
$
是一个运算符,用于获取由变量(或表达式)命名的字段的值根据Glen的回答,…我需要在一个模式结束后替换一个空行,因此我提出了下面的修改代码,当然没有响应那么优雅,但它可以工作suffix=“.$.tmp”awk-v suf=“$suffix”'FNR==1{outfile=FILENAME suf}{if(/pattern/){headerfound=1}else if(headerfound&&/^[:blank:][]*$/){$1=“”,“headerfound=0}其他{headerfound=0}}{print>outfile}'*.txt在*.txt中代表f;do mv“${f}${suffix}”$f”donethaks Glenn!工作得很好。刚刚在mv中添加了一个braket:mv“${f}{suffix}”$f”谢谢Glenn!工作得很好。刚刚在mv:mv mv mv“${f}中添加了一个braket${后缀}“$f”标记Glenn的解决方案,因为我的ubuntu机器中没有4.1。这很好,但如果您在创建tmp文件时遇到问题,Glenn的解决方案将删除您的原始文件,这可能不可取。我用一个非gawk的解决方案更新了我的答案,但不会这样做。标记Glenn的解决方案,因为我的ubuntu机器中没有4.1。标记Glenn的解决方案,因为我的ubuntu机器的fi中没有4.1但是,如果您在创建tmp文件时遇到问题,Glenn的解决方案将删除您的原始文件,这可能是不可取的。我用一个非笨拙的解决方案更新了我的答案,但它不会这样做。
awk -v suf="$suffix" '
    FNR == 1 {outfile = FILENAME suf}
    /pattern/ {lineno = FNR}
    FNR == lineno+1 && NF == 0 {$0 = "--"}
    { print > outfile }
' *.txt