Сортировка элементов файла CSV

В Linux вы можете проверить это с помощью инструмента gdisk , который должен быть доступен для любого дистрибутива.

gdisk -l /dev/sda

Здесь / dev / sda - это узел устройства физического диска , а не раздел ( / dev / sda1 , / dev / sda2 и т. д. являются разделами).

Если вы видите что-то, что включает в себя:

***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. 
***************************************************************

У вас диск в стиле MBR. Не волнуйтесь, это не повредило.

Если вы не видите это предупреждение, у вас есть диск GPT или гибридный диск GPT / MBR . Последние используются в основном на машинах Apple, предназначенных для версий MS Windows с двойной загрузкой, которые не поддерживают GPT. gdisk укажет на это с помощью:

Found valid GPT with hybrid MBR; using GPT

Они также могут использоваться в других ситуациях, когда требуется поддержка обоих стилей.

1
26.02.2019, 12:27
4 ответа

Проблема, с которой вы столкнулись, заключается в том, что у вас есть файлы с окончаниями строк MAC (\r ), тогда как выполняемые вами команды предполагают окончания строк Unix (\n ).

ИспользуйтеPerl:

$ perl -l015 -F, -0015 -pae '$_ = join ",", shift @F, sort { $a <=> $b } @F' input.csv

Опции:

  • -lустанавливает ORSв \r= восьмеричное 15.
  • -0устанавливает RSв \r= восьмеричное 15.
  • -pбудет циклически просматривать ваш CSV-файл для каждой записи. Запись отделяется от входного файла с помощью RS, что равно \r, как установлено опцией -0.
  • -Fустановит запятую в качестве разделителя полей для каждой записи по мере ее чтения.
  • -aразделит каждую запись по мере ее чтения на поля и сохранит в массиве @F.
  • Обратите внимание, :важен порядок указания опций.

Таким образом, вывод, который вы получите, также будет иметь окончания строки MAC. Вот почему вы НЕ видите ожидаемый результат, а все ваши выходные записи выглядят сжатыми в одну строку на основе всех приведенных здесь решений.

1
28.01.2020, 02:11

Сperl:

perl -F, -lape '$_ = join ",", shift @F, sort {$a <=> $b} @F' < input.csv

С помощью GNUawk:

gawk -F, '
  {
    split($0, a)
    printf "%s", a[1]
    delete a[1]
    n = asort(a)
    for (i = 1; i <= n ; i++) printf "%s", FS a[i]
    print ""
  }' < input.csv

Или с помощью библиотеки join.awk(спасибо @WeijunZhou)

gawk -i join -F, -v OFS=, '
  {
    split($0, a)
    first = a[1]
    delete a[1]
    n = asort(a)
    print first, join(a, 1, n, OFS)
  }'
2
28.01.2020, 02:11

Для простого csvбез кавычек попробуйте это:

while IFS= read -r l; do
    col1=$(printf '%s' "$l" | cut -d, -f1)
    printf '%s,' "$col1"
    printf '%s' "$l" | cut -d, -f2- | grep -o "[0-9]*" | sort -n | paste -sd,
done < file
-2
28.01.2020, 02:11

Пробовал с помощью приведенной ниже комбинации методов awk и sed

j=awk '{print NR}' filename | sort -nr| sed -n '1p'

for ((i=1;i<=$j;i++)); do k=`awk -F "," -v  i="$i" 'NR==i {print $1}' i.txt` ;echo $k;awk -F "," -v i="$i" 'NR==i {$1=" ";print $0}' i.txt| sed -r "s/^\s+//g"| perl -pne "s/ /\n/g"| sort -n| perl -pne "s/\n/ /g";echo " "| sed "s/.*/&\n/g";done|sed '/^$/d'| sed "N;s/\n/ /g"| sed "s/ /,/g"| sed "s/\,*$//g"

выход

1083,10,20,23,28,42,43
1084,5,20,29,33,40,59
1085,12,21,39,40,50,55
1086,2,4,6,10,23,45
1087,3,20,28,32,36,46
-2
28.01.2020, 02:11

Теги

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