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
для каждого N в 1, 2, 3, с одним именем файла в строке. Если какой-либо файл имеет другое содержимое, отличное от того, что вы указали в вопросе, например, другое первое поле или длину, вы получите дополнительные файлы классов.
В неправильном случае, когда имя файла само содержит символ новой строки,это развалится (и даст вам возможность пересмотреть свой выбор имени файла ), но в остальном все должно быть в порядке.