在 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
我正在尝试将一组文本文件 (*.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