首页 > 解决方案 > Bash - 删除目录中只有一列的制表符分隔文件

问题描述

这是一个奇怪的问题,但我在一个目录中有一些文件应该代表表/数据框。所有文件都有一列(对应于该表的主键)。然后其中一些有额外的列。我想删除所有只有一列的文件(即没有信息)。我该怎么做呢?

例子:

file1.txt`

Probe_ID    GSM132623   GSM132624
1007_s_at   2837.69027061651    2569.91309822531
1053_at 201.081555674069    262.183863416559
117_at  210.403458841772    298.823864999618
121_at  1336.98480463819    1302.96339762767
1255_g_at   70.4408895702285    79.4993012107624
1294_at 464.670062349198    419.035541864715
1316_at 125.550889354316    138.930668105088
1320_at 262.68745143115 208.905917842229
1405_i_at   13.6321130349956    17.7600809690828

file2.txt

Probe_ID
100_g_at
1000_at
1001_at
1002_f_at
1003_s_at
1004_at
1005_at
1006_at
1007_s_at

在这种情况下,我想file2.txt从我的目录中删除。

编辑:哦,所有文件都将具有file*.txt. 所以我只想查看这些文件。不是我目录中的其他人。

标签: bash

解决方案


您可以尝试以下任何选项:

选项一

用awk获取第一行的file*.txt列数,如果列数等于,则删除与模式匹配的所有文件1

for i in file*.txt; do cols=$(awk -F'\t' '{print NF; exit}' "$i"); if [ $cols -eq 1 ]; then rm -f "$i"; fi; done

选项二

获取第一行的列数,如果列数等于,则head -1 "$i" | tr '\t' '\n' | wc -l删除与模式匹配的所有文件file*.txt1

for i in file*.txt; do cols=$(head -1 "$i" | tr '\t' '\n' | wc -l); if [ $cols -eq 1 ]; then rm -f "$i"; fi; done

推荐阅读