根据第一列的内容区分文件

根据第一列的内容区分文件

我有多个带有扩展名的制表符分隔文件.cluster。我想使用以下标准根据第一列内容对这些文件进行分类:(2并且3是文件内的实际数字/内容)

  • class_1:仅2AND3出现在连续行中
  • 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

这分为三个部分:

  1. 默认情况下,它根据唯一行的第一个字段对文件进行分类:变量class设置为文件中的任何内容,直到每行的第一个制表符。对于 2 类和 3 类,这将是 或23因为这些文件只有一行。

    cut按分隔符分割文件,$'\t'是一种编写制表符的 Bash 方式,并-f1要求cut仅输出第一个分隔字段。

  2. 如果文件有两个线$(wc -l "$filename") -eq 2), 它必须为类 1,因此该class变量被强制设置为 1,替换步骤 1 中的值。if...fi处理此问题。
  3. 最后,文件名被附加到适当的类文件中:printf '%s\n' "$filename" >> class_"$class".txt

最后,class_N.txt1、2、3 中的每个 N 都会有三个文件,每行一个文件名。如果任何文件有一些其他内容与您在问题中概述的内容不同,例如不同的第一个字段或长度,您将创建额外的类文件。

在文件名本身包含换行符的反常情况下,这将崩溃(并让您有机会重新考虑文件名选择),但否则应该没问题。

相关内容