В 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
Они также могут использоваться в других ситуациях, когда требуется поддержка обоих стилей.
Проблема, с которой вы столкнулись, заключается в том, что у вас есть файлы с окончаниями строк 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. Вот почему вы НЕ видите ожидаемый результат, а все ваши выходные записи выглядят сжатыми в одну строку на основе всех приведенных здесь решений.
С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)
}'
Для простого 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
Пробовал с помощью приведенной ниже комбинации методов 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