Различение файлов на основе содержимого первого столбца

Вот пример:

function arr_sort(ary,   x, y, z) {
  for (x in arr) {
    y = arr[x]
    z = x - 1
    while (z && arr[z] > y) {
      arr[z + 1] = arr[z]
      z--
    }
    arr[z + 1] = y
  }
}

Источник

0
16.04.2019, 10:05
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для класса 2 и 3, поскольку эти файлы имеют только одну строку.

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

В неправильном случае, когда имя файла само содержит символ новой строки,это развалится (и даст вам возможность пересмотреть свой выбор имени файла ), но в остальном все должно быть в порядке.

1
28.01.2020, 02:40

Теги

Похожие вопросы