сортировать и uniq столбцы отдельно в текстовом файле

У меня есть файл, как показано ниже:

DFTE ARTE KAOE ETPJ 

Я хотел бы отсортировать каждый столбец и уникальные столбцы отдельно, как показано ниже:

 AAOE DFPJ ERT KT 

Интересно, есть ли кто-нибудь, кто знает, как использовать sort или uniq для этого?

  • Использование Uniq -c с регулярным выражением или подсчет количества удаленных строк
  • Мне нужны данные из файла csv, которого нет во втором файле csv
  • линии с уникальной контрольной суммой
  • Сортировка данных журнала с помощью bash
  • Удаление повторяющихся строк после сравнения первого шаблона и специального шаблона
  • Получить строки с максимальными значениями в столбце с помощью awk, uniq и sort
  • Удалите повторяющиеся строки с помощью twist
  • Почему эта команда не сортируется на основе индекса uniq?
  • 2 Solutions collect form web for “сортировать и uniq столбцы отдельно в текстовом файле”

    Вы можете попробовать что-то вроде этого:

     paste -d'\t' <(cut -f 1 -d' ' file | sort -u) <(cut -f 2 -d' ' file | sort -u) <(cut -f 3 -d' ' file | sort -u) <(cut -f 4 -d' ' file | sort -u) >output 

    Я ставлю tab качестве разделителя paste чтобы быть более заметным на выходе.

    (Мне нравится ответ на пасту / cut @taliezin. Вот более прозаическое решение в случае многих столбцов). Разделите данные в один файл на один столбец, отсортируйте эти файлы и объедините файлы. Я предполагаю столбцы фиксированной ширины 1 символа, например, чтобы столбец 2 был короче столбца 3. В этом демо- data0 исходный файл:

     for i in {1..4} do awk -vi=$i '{ch = substr($0,i*2-1,1);if(ch!=" ")print ch}' </tmp/data0 | sort -u >/tmp/data$i done awk -v rows=$(wc -l </tmp/data0) ' BEGIN{ for(i=1;i<=4;i++) file[i] = "/tmp/data" i while(rows-->0){ for(i=1;i<=4;i++){ d = "" getline d <file[i] printf("%1s ",d) } printf "\n" } }' </dev/null в for i in {1..4} do awk -vi=$i '{ch = substr($0,i*2-1,1);if(ch!=" ")print ch}' </tmp/data0 | sort -u >/tmp/data$i done awk -v rows=$(wc -l </tmp/data0) ' BEGIN{ for(i=1;i<=4;i++) file[i] = "/tmp/data" i while(rows-->0){ for(i=1;i<=4;i++){ d = "" getline d <file[i] printf("%1s ",d) } printf "\n" } }' </dev/null 
    Linux и Unix - лучшая ОС в мире.