Как отсортировать следующий файл с помощью сценария оболочки? - PullRequest
0 голосов
/ 14 августа 2010

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

11:00AM JOHN STAMOS 1983-08-07 I like Pizza Hut
12:00AM JACK SPARROW PIRATE 1886-09-07 I like Pizza Hut and DOminoz
11:00AM SANTA 1986-04-01 I like cold beer

Как отсортировать указанный выше файл в столбце даты?Проблема, с которой я сталкиваюсь, связана с именем столбца переменной длины.У некоторых людей есть первая отчество, где у некоторых есть только имя и т. Д.

Ответы [ 4 ]

1 голос
/ 14 августа 2010

Что вам нужно сделать, это скопировать дату вперед, а затем отсортировать, которая по умолчанию будет использовать всю строку в качестве ключа сортировки. Затем снова удалите дату.

Я использовал sed, чтобы выбрать все до (последней) даты, которую я нашел по ее формату nnnn-nn-nn, и скопировать дату на передний план.

После сортировки просто используйте sed (или было бы проще вырезать -c11-), чтобы снова удалить дату с фронта.

Это работает в Linux:

sed 's/^\(.* \([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] \)\)/\2\1/' | 
sort | 
sed 's/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] //'

Предоставление:

12:00AM JACK SPARROW PIRATE 1886-09-07 I like Pizza Hut and DOminoz
11:00AM JOHN STAMOS 1983-08-07 I like Pizza Hut
11:00AM SANTA 1986-04-01 I like cold beer

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

1 голос
/ 14 августа 2010
sed 's/\([0-9]\{4\}\(-[0-9]\{2\}\)\{2\}\)/|\1/' | sort -t '|' -k 2| sed s/'|'//
0 голосов
/ 14 августа 2010

Pure Bash:

declare -a array
declare -a order

IFS=$'\n'
array=( $(cat "$infile") )

index=0
for line in "${array[@]}"; do
  [[ "$line" =~ ([[:digit:]]+)-([[:digit:]]+)-([[:digit:]]+)  ]]
  key="${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[3]}"
  if [ -z "${order[key]}" ] ; then
    order[key]="$index"
  else
    order[key]="${order[key]} $index"
  fi
  ((index++))
done < "$infile"

IFS=' '
for key in ${order[*]}; do
  printf "%s\n" "${array[key]}"
done

Генерирует индексы по датам и использует их как отсортированный список.

0 голосов
/ 14 августа 2010
cat file.txt | python -c 'import re, sys; print "".join(sorted(sys.stdin, key=lambda x:re.findall("\d{4}-\d{2}-\d{2}",x)))'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...