2

我有一个看起来像这样的大文件:

7f0c41d6-f9c6-47aa-a034-d40bc629c973.csv
159890
159891
24faaed6-62ee-4175-8430-5d73b09911c8.csv
159907
5bad221f-25ef-44fa-9086-fd152e697928.csv
642e4ac3-3d46-4b4c-b5c8-aa2fa54d0b04.csv
d0e145a5-ceb8-4d4b-ae47-11e0c9a6548d.csv
159929
ba678cbd-af57-493b-a69e-e7504b4bc328.csv
7750840f-9bf9-4a68-9f25-a2ba0968d481.csv
159955
159959

而且我只对*.csv 文件感兴趣,有人可以指出如何删除不以.csv.

谢谢你。

4

5 回答 5

11
grep "\.csv$" file 

只会拉出那些以 .csv 结尾的行

然后,如果您想将它们放在不同的文件中;

grep "\.csv$" file > newfile
于 2013-09-27T17:54:36.380 回答
3

sed是你的朋友:

sed -i.bak '/\.csv$/!d' file

-i.bak:就地编辑。创建带有.bak扩展名的备份文件

于 2013-09-27T18:02:47.760 回答
2
 ([0-9a-zA-Z-]*.csv$)

这是只选择以 .csv 扩展名结尾的文件名的正则表达式代码。

希望这会帮助你。有关详细信息,请参阅此图像

于 2013-09-27T18:05:38.307 回答
1

如果您不想为了删除不需要的文件而将文件名保存在另一个文件中,那么这也可能是满足您需求的附加解决方案(理解这是一个老问题)。

此单行for循环递归地使用grep "\.csv" file解决方案,因此您无需管理保存在这里或那里的多个文件名。

for f in *; do if [ ! "$(echo ${f} | grep -Eo '.csv')" == ".csv" ]; then rm "${f}"; fi; done

作为向您展示它按预期工作的视觉辅助(用于删除除 csv 文件之外的所有文件),这里是一个快速而肮脏的屏幕截图,显示了使用您的示例输出的结果。

在此处输入图像描述

这是单行命令的稍短版本:

for f in *; do if [ ! "$(echo ${f} | grep -o '.csv')" ]; then rm "${f}"; fi; done

这是使用示例的 csv 文件名和一些随机生成的文本文件的示例输出。

在此处输入图像描述

使用这种带有条件的循环的目的是保证您只删除您想要删除的文件(非 csv 文件)并且仅在当前工作目录中而不解析ls命令。

希望这可以帮助您和其他正在寻找类似解决方案的人。

于 2018-01-13T09:18:40.633 回答
1

如果您熟悉 vim 文本编辑器(vim 或 vi 通常安装在许多 linux 机器上),请使用以下 vim Ex 模式命令删除与特定模式不匹配的行:

:v/<pattern>/d

例如,如果我想删除所有不包含的行,"column"我会运行:

:v/"column"/d

希望这可以帮助。

于 2018-01-11T19:44:37.333 回答