我有一个文本文件,句子之间有很多空行。我使用sed,gawk,grep,但他们不工作。 :(。我现在该怎么办?谢谢。
Myfile: Desired file:
a a
b b
c c
. .
d d
e e
f f
g g
. .
h
i
h j
i k
j .
k
.
答案 0 :(得分:2)
你可以使用awk
:
awk 'BEGIN{prev="x"}
/^$/ {if (prev==""){next}}
{prev=$0;print}' inputFile
或压缩的一个衬垫:
awk 'BEGIN{p="x"}/^$/{if(p==""){next}}{p=$0;print}' inFl
这是一个简单的状态机,可将多个空白行折叠为单个行。
基本理念是这样的。首先,将上一行设置为非空。
然后,对于文件中的每一行,如果它和前一行是空白的,就把它扔掉。
否则,将上一行设置为该值,打印该行,然后继续。
示例脚本,以下命令:
$ echo '1
2
3
4
5
6
7
8
9
10' | awk 'BEGIN{p="x"}/^$/{if(p==""){next}}{p=$0;print}'
输出:
1
2
3
4
5
6
7
8
9
10
请注意,这是真正的空白行(没有内容)。如果您试图折叠具有任意数量的空格或制表符的行,那将会有点棘手。
在这种情况下,您可以通过以下方式管道文件:
sed 's/^\s*$//'
确保只有空格的行变为真空。
换句话说,比如:
sed 's/^\s*$//' infile | awk 'my previous awk command'
答案 1 :(得分:2)
使用GNU cat抑制重复的空输出行:
cat -s file1 > file2
答案 2 :(得分:0)
你也可以这样做,
awk -v RS="\0" '{gsub(/\n\n+/,"\n\n");}1' file
<强>解释强>
RS="\0"
一旦我们将空字符设置为Record Seperator值,awk会将整个文件作为单个记录读取。gsub(/\n\n+/,"\n\n");
这会用一个空行替换一个或多个空行。请注意,\n\n
正则表达式与空行以及上一行的换行符匹配。答案 3 :(得分:0)
这是使用sed
的一种方式:
sed ':a; N; $!ba; s/\n\n\+/\n\n/g' file
否则,如果您不介意尾随空行,您只需要:
awk '1' RS= ORS="\n\n" file
Perl解决方案更短:
perl -00 -pe '' file
答案 4 :(得分:0)
这是另一个awk
awk -v p=1 'p=="" {p=1;next} 1; {p=$0}' file