Bash-删除目录中只有一列的以制表符分隔的文件
这是一个奇怪的问题,但我在目录中有一些文件应该表示表/数据帧。所有文件都有一列(对应于该表的主键)。然后,其中一些具有附加列。我想删除只有一列(即没有信息)的所有文件。我该怎么做呢 例如:Bash-删除目录中只有一列的以制表符分隔的文件,bash,Bash,这是一个奇怪的问题,但我在目录中有一些文件应该表示表/数据帧。所有文件都有一列(对应于该表的主键)。然后,其中一些具有附加列。我想删除只有一列(即没有信息)的所有文件。我该怎么做呢 例如: file1.txt` Probe_ID GSM132623 GSM132624 1007_s_at 2837.69027061651 2569.91309822531 1053_at 201.081555674069 262.183863416559 117_at 210.4034
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
格式。所以我只想看看那些文件。不是我的目录中的其他选项。您可以尝试以下任何选项:
选项一
使用awk获取第一行中的列数,如果列数等于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
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
选项二
使用head-1“$i”|tr'\t'\n'|wc-l
获取第一行中的列数,如果列数等于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
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
使用
grep-l-v$'\t'file*.txt
获取其中没有选项卡的所有文件的列表。将其用作要删除的文件列表。对此我很抱歉。但我完全不知道如何继续进行这项工作。我的击打技术很差。我想我会对所有的文件*.txt文件使用cut-f2
命令,并将其传输到wc-l
以查看哪些文件有0行,但我认为这比应该的要复杂一些。grep-lv'\t'file*.txt | xargs rm
,而不是grep-lv
,您可以使用grep-L
来实现相同的效果。@dibery并非所有的grep都是GNU grepOP想要删除只有一列的文件。你需要否定这个逻辑。此外,最好说for i In file*.txt
来缩小目标文件的范围。请注意,“file glob”
模式中的for var被认为是有害的,因为如果任何文件名中都有空格(或者更准确地说,如果是IFS字符),它将失败。没有理由在读取变量时不总是使用ls“file glob”代码>模式。请给出解释。将代码拆分为多行也是如此。使用awk的基本jist在这里非常完美。