shell脚本去除文件中的空行

目标文件

[clooker ~]$ cat 123 
aaaaaaaaaaaaaaaaaaaaaaa

bbbbbbbbbbbbbbbbbbbbbbb

ccccccccccccccccccccccc

ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee


fffffffffffffffffffffff

 gggggggggggg ggggggggg
[clooker ~]$ 

1. 使用tr命令

tr的核心功能及时删除或者转换字符,详细说明如下:

NAME
       tr - translate or delete characters

SYNOPSIS
       tr [OPTION]... SET1 [SET2]

DESCRIPTION
       Translate, squeeze, and/or delete characters from standard input, writing to standard output.

       -c, -C, --complement
              use the complement of SET1

       -d, --delete
              删除出现在SET1中的字符

       -s, --squeeze-repeats
              去掉连续出现字符中后续的重复字符,只留第一个。

       -t, --truncate-set1
              first truncate SET1 to length of SET2      

所以,我们可以使用tr -s命令去掉重复出现的\n,达到删除空行的目的。如下:

[clooker ~]$ cat 123 |tr -s '\n'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
 gggggggggggg ggggggggg
[clooker ~]$ 

补充
除了简单的去除空行,tr支持很多其他功能。下面列出的所有字符描述都可以作为替换或者删除的目标:

\NNN   character with octal value NNN (1 to 3 octal digits)

\\     backslash

\a     audible BEL

\b     backspace

\f     form feed

\n     new line

\r     return

\t     horizontal tab

\v     vertical tab

CHAR1-CHAR2
all characters from CHAR1 to CHAR2 in ascending order

[CHAR*]
in SET2, copies of CHAR until length of SET1

[CHAR*REPEAT]
REPEAT copies of CHAR, REPEAT octal if starting with 0

[:alnum:]
all letters and digits

[:alpha:]
all letters

[:blank:]
all horizontal whitespace

[:cntrl:]
all control characters

[:digit:]
all digits

[:graph:]
all printable characters, not including space

[:lower:]
all lower case letters

[:print:]
all printable characters, including space

[:punct:]
all punctuation characters

[:space:]
[:upper:]
all upper case letters

[:xdigit:]
all hexadecimal digits

[=CHAR=]
all characters which are equivalent to CHAR

例如我们想要删除所有字符a

[clooker ~]$ echo abcdabcd |tr -d 'a'
bcdbcd
[clooker ~]$ 

删除所有小写字符

[clooker ~]$ echo abcdabcdABCDa |tr -d [:lower:]
ABCD
[clooker ~]$ 

2. 使用sed命令

sed是常见的字符替换命令,标准格式是:

[clooker ~]$ echo 123456 |sed 's/3/c/g'
12c456
[clooker ~]$ 

去掉空行命令如下:

[clooker ~]$ cat 123 |sed '/^$/d'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
 gggggggggggg ggggggggg
[clooker ~]$ 

d:删除匹配到的字符
//:可以放置正则表达式
^:行开始
KaTeX parse error: Expected group after '^' at position 19: …束 因此上述命令表示删除空行(^̲之间没有任何字符)。

3. 使用grep命令

原理同上。

[clooker ~]$ cat 123 |grep -v '^$'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
 gggggggggggg ggggggggg
[clooker ~]$

-v:不包含

4. 使用awk命令

[clooker ~]$ cat 123 |awk '$0'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
 gggggggggggg ggggggggg
[clooker ~]$

awk默认按照空格对每一行进行分割,然后通过$n输出想要的数据。
$0:所有字符

其实对一部分人来说,对上边那个命令还有些疑惑,下面详细了解下。
常见的awk使用方式是:

[clooker ~]$ cat 123 |awk '{print $1}'
aaaaaaaaaaaaaaaaaaaaaaa

bbbbbbbbbbbbbbbbbbbbbbb

ccccccccccccccccccccccc

ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee


fffffffffffffffffffffff

gggggggggggg
[clooker ~]$ 

我们把空格作为分隔符,对每一行数据进行分割,然后输出第一列。可以看到最后一行数据的第二列没有输出。

然后我们还可以加一些判断条件,只输出满足条件的数据:

[clooker ~]$ cat 123 |awk '{print length}'
23
0
23
0
23
0
23
23
0
0
23
0
23
[clooker ~]$

[clooker ~]$ cat 123 |awk '{if(length>1) print}'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
 gggggggggggg ggggggggg
[clooker ~]$ 

其中length是awk命令中的内置变量,除了length还有NF(分割后的列数)等。

如果判断条件不负责,可以提到大括号之前的:

[clooker ~]$ cat 123 |awk 'length>1{print}'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
 gggggggggggg ggggggggg

如果全部数据都需要输出,那么{}也是可以省略的:

[clooker ~]$ cat 123 |awk 'length>1'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
 gggggggggggg ggggggggg
[clooker ~]$ 

由此我们可以知道,这个命令是先按照空格对每行进行分割,然后把满足条件的行输出出来。
$0表示一行中的全部字符,所以如果是空行,则$0就是false,所以就不会输出,所以实现删除空行的功能。

我们可以再验证下
最后一行分割后会有两列,前边的都是一列,我们可以把$0换成$2,从而只保留最后一列。

[clooker ~]$ cat 123 |awk '$2'
 gggggggggggg ggggggggg
[clooker ~]$ 

结果符合我们的预期。

其他

Linux下的awk还有很多很强大的功能,例如对一行中的数据进行计算。
原始数据:

[clooker ~]$ cat nums 
1 2 3
4 5 6
7 8 9
[clooker ~]$

每一行的第一列和最后一列相加,输出每一行的结果

[clooker ~]$ cat nums |awk '{sum=$1+$3}{print sum}'
4
10
16
[clooker ~]$ 

每一行的第一列相加,输出最终结果

[clooker ~]$ cat nums |awk '{sum+=$1}END{print sum}'
12
[clooker ~]$ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值