我有多个带有扩展名的制表符分隔文件.cluster
。我想使用以下标准根据第一列内容对这些文件进行分类:(2
并且3
是文件内的实际数字/内容)
- class_1:仅
2
AND3
出现在连续行中 - class_2:仅
2
存在 - class_3:仅
3
存在
我想将它们的文件名写入.txt
具有各自类名的文件中。我如何使用 shell 脚本来做到这一点?
答案1
for filename in *.cluster
do
class=$(cut -d$'\t' -f1) # Part 1
if [ $(wc -l "$filename") -eq 2 ] # Part 2, start
then
class=1
fi # Part 2, end
printf '%s\n' "$filename" >> class_"$class".txt # Part 3
done
这分为三个部分:
默认情况下,它根据唯一行的第一个字段对文件进行分类:变量
class
设置为文件中的任何内容,直到每行的第一个制表符。对于 2 类和 3 类,这将是 或2
,3
因为这些文件只有一行。cut
按分隔符分割文件,$'\t'
是一种编写制表符的 Bash 方式,并-f1
要求cut
仅输出第一个分隔字段。- 如果文件有两个线(
$(wc -l "$filename") -eq 2
), 它必须为类 1,因此该class
变量被强制设置为 1,替换步骤 1 中的值。if
...fi
处理此问题。 - 最后,文件名被附加到适当的类文件中:
printf '%s\n' "$filename" >> class_"$class".txt
最后,class_N.txt
1、2、3 中的每个 N 都会有三个文件,每行一个文件名。如果任何文件有一些其他内容与您在问题中概述的内容不同,例如不同的第一个字段或长度,您将创建额外的类文件。
在文件名本身包含换行符的反常情况下,这将崩溃(并让您有机会重新考虑文件名选择),但否则应该没问题。