Shell操作文本

本文遵循BY-SA版权协议,转载请附上原文出处链接。


本文作者: 黑伴白

本文链接: http://heibanbai.com.cn/posts/6e215cee/

Shell操作文本

本文主要记录在Shell脚本中常见的一些文件操作命令:

  • 去除空行

  • 去除重复行

  • 判断文件是否存在或是否为空

  • ……

去除文件中的空行

1
2
3
4
5
6
7
8
9
10
11
# 方法1
cat file.txt |tr -s '\n'
# 方法2
cat file.txt |sed '/^$/d'
# 方法3
cat file.txt |grep -v '^$'
# 方法4
# $0表示一行中的全部字符,如果是空行,则$0就是false,就不会输出,实现删除空行的功能
cat file.txt |awk '$0'
cat file.txt |awk '{if($0!="")print}'
cat file.txt |awk '{if(length !=0) print $0}'

删除文件中的重复行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 方法1
sort file.txt | uniq
# 方法2
sort file.txt | awk '{if ($0!=line) print;line=$0}'
# 方法3
sort file | sed '$!N; /^\(.*\)\n\1$/!P; D'
# 方法4
sort -u file.txt
# 方法5 保持原行间相对顺序去重
awk '!a[$0]++' file.txt
# 方法5释义
#首先创建一个map叫a,然后用当前行的全文$0作为map的key,到map中查找相应的value,如果没找到,则整个表达式的值为真,可以执行之后的语句;如果找到了,则表达式的值为假,跳过这一行。
#由于表达式之后有++,因此如果某个key找不到对应的value,该++操作会先把对应的value设成 0,然后再自增成1,这样下次再遇到重复的行的时候,对应的key就能找到一个非0的value了。
#awk 的流程是先判断表达式,表达式为真的时候就执行语句,可是我们前面写的这个 awk 命令里只有表达式,没有语句,那我们执行什么呢?原来,当语句被省略的时候,awk 就执行默认的语句,即打印整个完整的当前行。就这样,我们通过这个非常简短的 awk 命令实现了去除重复行并保留原有文件顺序的功能。

判断文件是否存在或是否为空

1
2
3
4
5
6
7
8
9
# -f判断是不是文件
# -d判断是不是目录
# -e判断文件/目录是否存在
# -s判断文件长度是否不为0 当-s后面跟目录是则判断目录是否存在
if test -s file.txt;then
echo "file.txt exists and not empty"
else
echo "file.txt not exits or empty"
fi

统计文件条数

1
2
3
4
5
6
7
8
9
10
11
12
# 方法1
awk '{print NR}' file.txt|tail -n1
# 方法2
awk 'END{print NR}' file.txt
# 方法3
grep -n "" file.txt|awk -F: '{print $1'}|tail -n1
# 方法4
sed -n '$=' file.txt
# 方法5
wc -l file.txt
# 方法6
cat file.txt |wc -l

蚂蚁再小也是肉🥩!


Shell操作文本
http://heibanbai.com.cn/posts/6e215cee/
作者
黑伴白
发布于
2023年3月9日
许可协议

“您的支持,我的动力!觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付