linux 文件一些操作

目录

单个文件

1. 查看文件行数

2. 检查和处理文件重复行的数据 ( --uniq命令 )

2.1 去除重复行

2.2 删除重复行并且统计各行在文件中出现的次数

2.3 查找非重复行,仅显示出1次的行列

2.4 查找重复行,仅显示出大于1次(重复)的行列

2.5 去除重复行

2.6 删除重复行并且统计各行在文件中出现的次数

2.7 查找非重复行,仅显示出1次的行列

2.8 查找重复行,仅显示出大于1次(重复)的行列

多个文件

1. 比较两个文件里面的内容是否一致

2. 文件合并

2.1 两个文件合并

2.2 两个文件交集、并集


单个文件

1. 查看文件行数

wc -l file # 输出 file 的行数

2. 检查和处理文件重复行的数据 ( --uniq命令 )

使用uniq的时候要注意点:
对文本操作时,它一般会和sort命令进行组合使用,因为 uniq 不会检查重复的行,除非它们是相邻的行。如果您想先对输入排序,使用sort -u。

  • 重复行相邻

2.1 去除重复行

uniq file 

2.2 删除重复行并且统计各行在文件中出现的次数

uniq -c file  

2.3 查找非重复行,仅显示出1次的行列

uniq -u file 

2.4 查找重复行,仅显示出大于1次(重复)的行列

uniq -d file 
  • 重复行不相邻,先使用sort排序

2.5 去除重复行

sort file | uniq 

2.6 删除重复行并且统计各行在文件中出现的次数

sort file | uniq -c

2.7 查找非重复行,仅显示出1次的行列

sort file | uniq -u

2.8 查找重复行,​​​​​​​仅显示出大于1次(重复)的行列​​​​​​​

sort file | uniq -d

多个文件

1. 比较两个文件里面的内容是否一致

  • 取相同的行
grep -wf [file1] [file2] ...
  • 取不同的行
grep -wvf [file1] [file2] ...
  • 逐行比较文件的不同,怎么改变第一个文件之后与第二个文件匹配。
diff [选项] file1 file2

diff file1 file2 #正常显示
diff -c file1 file2 #上下文格式显示
diff -u file1 file2 #合并格式显示

   常用选项

选项

含义

备注

-b

不检查空格

-B 不检查空白行
-i 不检查大小写
-w 忽略所有的空格
-normal 正常格式显示(默认)
-c 上下文格式显示
-u 合并格式

举例说明

[wqf@hello rm_test]$ cat file1.txt 
aaaa
111
hello world
222
333
bbb

[wqf@hello rm_test]$ cat file2.txt
aaa
hello
111
222
bbb
333
world

[wqf@hello rm_test]$  grep -wf file1.txt file2.txt #取相同的行
111
222
bbb
333
[wqf@hello rm_test]$  grep -wvf file1.txt file2.txt #取不同的行
aaa
hello
world

[wqf@hello rm_test]$ diff file1.txt file2.txt
1c1,2         第一个文件的第1行需要改变(c=change)才能和第二个文件的第1到2行匹配
< aaaa        小于号"<"表示左边文件(file1)文件内容
---           ---表示分隔符
> aaa         大于号">"表示右边文件(file2)文件内容
> hello       第一个文件的第3行删除(d=delete)后才能和第二个文件的第3行匹配
3d3
< hello world
5d4           第一个文件的第5行删除后才能和第二个文件的第4行匹配
< 333
6a6,7         第一个文件的第6行增加(a=add)内容后才能和第二个文件的第6到7行匹配
> 333         需要增加的内容在第二个文件里是333和world
> world

[wqf@hello rm_test]$ diff -c file1.txt file2.txt
两行主要列出需要比较的文件名和文件的时间戳;文件名前面的符号***表示file1,---表示file2
*** file1.txt   2023-01-05 09:34:40.868721925 +0800
--- file2.txt   2023-01-05 09:35:02.513082078 +0800
***************     我是分隔符
*** 1,6 ****        以***开头表示file1文件,1,6表示1到6行
! aaaa              !表示该行需要修改才与第二个文件匹配
  111               
- hello world       -表示需要删除该行才与第二个文件匹配
  222
- 333               -表示需要删除该行才与第二个文件匹配
  bbb
--- 1,7 ----        以---开头表示file2文件,1,7表示1到7行
! aaa               表示第一个文件需要修改才与第二个文件匹配
! hello             表示第一个文件需要修改才与第二个文件匹配
  111
  222
  bbb
+ 333               表示第一个文件需要加上该行才与第二个文件匹配
+ world             表示第一个文件需要加上该行才与第二个文件匹配

[wqf@hello rm_test]$  diff -u file1.txt file2.txt 
--- file1.txt   2023-01-05 09:34:40.868721925 +0800
+++ file2.txt   2023-01-05 09:35:02.513082078 +0800
@@ -1,6 +1,7 @@
-aaaa    -表示第一个文件需要删除aaaa
+aaa     +表示第一个文件需要添加aaa
+hello   +表示第一个文件需要添加hello
 111      表示第一个文件不变
-hello world -表示第一个文件删除hello world
 222      表示第一个文件不变
-333      -表示第一个文件需要删除333
 bbb      表示第一个文件不变
+333      +表示第一个文件需要添加333
+world    +表示第一个文件需要添加world

tip

情景:有时候我们需要以一个文件为标准,去修改其他文件,并且修改的地方较多时,我们可以通过打补丁的方式完成。

1)先找出文件不同,然后输出到一个文件
[wqf@hello rm_test]$ diff -uN file1.txt file2.txt > file.patch
-u:上下文格式
-N:将不存在的文件当作空文件

2)将不同内容打补丁到文件
[wqf@hello rm_test]$ patch file1.txt file.patch
patching file file1.txt

3)测试验证
[wqf@hello rm_test]$ diff file1.txt file2.txt
[wqf@hello rm_test]$

2. 文件合并

2.1 两个文件合并

cat file1 file2 > file3 #一个文件在上,一个文件在下
paste file1 file2 > file3 #一个文件在左,一个文件在右

2.2 两个文件交集、并集

前提条件:每个文件中不得有重复行

2.2.1 取两个文件的并集(重复的行只保留一份)

cat file1 file2 |sort| uniq > file3

2.2.2 取两个文件的交集(只留下同时存在于两个文件中的文件)

cat file1 file2 |sort|uniq -d > file3

2.2.3 删除交集,取并集

cat file1 file2 |sort|uniq -u > file3

猜你喜欢

转载自blog.csdn.net/sodaloveer/article/details/125427502