Сортировка строк в формате CSV по тем, которые содержат числа, и тем, которые не содержат - PullRequest
5 голосов
/ 24 января 2012

У меня есть 4-колоночный файл CSV. Я хочу отсортировать строки так, чтобы строки, содержащие любое число где-то в третьем столбце, были перенесены в конец документа, а строки без номеров в третьем столбце - в начало. Как я могу отсортировать файл таким образом?

Обновление:

Чтобы уточнить, мне нужно переместить строки, которые содержат любое число (то есть совпадение с [0-9]), где-то в пределах букв третьего столбца (третий столбец строки может содержать другие символы). Пробелы не важны. Э.Г.

dog, eats chicken, has 4 legs, does not like cats
cat, eats mice, has a tail, does not like water
mouse, eats bugs, has 4 legs, does not like cats
elephant, eats peanuts, has a trunk, does not like mice

Будет отсортировано по:

cat, eats mice, has a tail, does not like water
elephant, eats peanuts, has a trunk, does not like mice
dog, eats chicken, has 4 legs, does not like cats
mouse, eats bugs, has 4 legs, does not like cats

Ответы [ 4 ]

4 голосов
/ 24 января 2012

Примерно так должно работать:

awk 'BEGIN {FS=","; OFS=","}; {print match($3,/[0-9]/), $0}' <file> | sort | cut -d, -f2-

Стратегия заключается в том, чтобы

  • использовать awk для вставки в начале каждой строки индекса, в котором находится цифра.найдено (или 0, если цифра не найдена)
  • используйте sort для сортировки всех строк
  • наконец, используйте cut для удаления числа, которому предшествовал awk.
3 голосов
/ 24 января 2012

Это короткий однострочный номер в awk, который не требует вызова других утилит, таких как sort

awk -F',' '$3 ~ /[[:digit:]]/{a[$0];next}1; END{for(i in a)print i}' ./infile

Объяснение

  • Если 3-е поле содержит цифру, сохраните текущую строку как ключ в массиве 'a' и обработайте следующую строку
  • Вывести все строки как есть, если они не соответствуют правилу выше
  • После того, как все строки были обработаны, выведите строки, которые мы сохранили в массиве 'a'

выход

$ awk -F',' '$3 ~ /[[:digit:]]/{a[$0];next}1; END{for(i in a)print i}' ./infile
cat, eats mice, has a tail, does not like water
elephant, eats peanuts, has a trunk, does not like mice
mouse, eats bugs, has 4 legs, does not like cats
dog, eats chicken, has 4 legs, does not like cats
2 голосов
/ 24 января 2012

Это может работать для вас:

sed 'h;s/,/\n/2;s/.*\n/0/;s/,.*//;s/[^0-9]//g;G;s/\n/\t/' file | 
sort -k1,1n -k2 | 
cut -f2

Объяснение:

  • Создать числовой ключ, используя числа из 3-го столбца (если ни один из них не установил ключ в 0)
  • Сортировка по указанному выше ключу, а затем по исходному файлу
  • Удалите числовой ключ
1 голос
/ 24 января 2012

Это будет работать в соответствии с порядком обработки строк, а также без использования каналов и внешних команд.

awk -F, '
$3~/[0-9]+/{a[++i]=$0;x=i;next}1
END{for(i=1;i<=x;i++) print a[i]}' file

Входной файл:

[jaypal:~/Temp] cat file
dog, eats chicken, has 4 legs, does not like cats
cat, eats mice, has a tail, does not like water
mouse, eats bugs, has 4 legs, does not like cats
elephant, eats peanuts, has a trunk, does not like mice

Тест:

[jaypal:~/Temp] awk -F, '
$3~/[0-9]+/{a[++i]=$0;x=i;next}1
END{for(i=1;i<=x;i++) print a[i]}' file
cat, eats mice, has a tail, does not like water
elephant, eats peanuts, has a trunk, does not like mice
dog, eats chicken, has 4 legs, does not like cats
mouse, eats bugs, has 4 legs, does not like cats
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...