Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash-删除目录中只有一列的以制表符分隔的文件_Bash - Fatal编程技术网

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在这里非常完美。