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