извлеките самые старые значения из основного файла на каждый код

Я нуждаюсь в помощи, пишущий сценарий, который извлек бы из основного файла самые старые записи и сохранил бы их в отдельном файле. Файл содержит сотни кодов ISIN и дополнительных данных. Для каждого существуют ежедневные записи. Идеальный сценарий вынул бы целую самую старую строку и сохранил бы ее в отдельном файле, названном этим код ISIN. Таким образом, я предполагаю разделение и grep комбинации?

Пример:

Столбец A - код ISIN (т.е. XX1234567891) <-2 буквы и 10 чисел

Столбец C - дата - 04.08.2019

Столбец B & D-I - соответствующие данные.

Какие-либо предложения? Следует иметь в виду, что я действительно в начале моей поездки с ударом.

Заранее спасибо за любую справку

Ниже ссылка на файл в качестве примера: https://drive.google.com/file/d/1Q3qhrVlIMA7cJhDVxjxoHCipEl8sV-xo/view? usp=sharing

пример с 3 другими ISIN's: example with 3 different ISIN's

Один файл с самой старой записью: One file with the oldest record

Второй файл с самой старой записью: Second file with the oldest record

3-й с самыми старыми записями - оба с той же датой: 3rd one with the oldest records - both with same date

Даты находятся в DD/MM/YYYY формате (теперь, когда я смотрю на него в Libre I, видят, что формат даты изменился на MM/DD/YYYY - но что я могу корректироваться позже).

1
задан 8 April 2019 в 19:19

2 ответа

Попробуйте это,

tail -n+2 file \
| sort -n -k 3.7,3.10 -k 3.4,3.5 -k 3.1,3.2 \
| awk '!s[$1]++{print > $1}'
  • tail -n+2 file просто удаляет строку заголовка
  • sort -n -k 3.7,3.10 -k 3.4,3.5 -k 3.1,3.2 сортирует дату.
  • awk '!s[$1]++{print > $1}' распечатайте только первую строку для каждого ISIN

Если Вы имели YYYY/MM/DD как формат даты, Вы могли просто сделать sort -k3.


awk только решение:

awk '
  NR==1{next}
  {
    split($3,d,"/")
    t=mktime(d[3]" "d[2]" "d[1]" 00 00 00")
    if(!s[$1]||t<s[$1]){
      s[$1]=t
      r[$1]=$0
    }
  }
  END {
    for (i in r) { print r[i] > i}
  }' file
0
ответ дан 7 December 2019 в 20:48

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

Здесь файл, что я использовал в качестве примера:

$ cat ISIN 
XX1234567890 Bcolumn 08/04/2019 Dcolumn
XX2234567890 Bcolumn 09/03/2019 Dcolumn
XX3234567890 Bcolumn 07/05/2019 Dcolumn
XX3234567890 Bcolumn 07/05/2018 Dcolumn
XX3234567890 Bcolumn 07/05/2016 Dcolumn
XX3234567890 Bcolumn 07/05/2017 Dcolumn
XX1234567890 Bcolumn 07/05/2015 Dcolumn

Вот сценарий, что обрабатывает самые старые 3 строки из входного файла, можно скорректировать это число:

#!/usr/bin/env bash

# replace ISIN with actual file name
# head -n 3 results in 3 oldest rows
# note the field separator, replace it with actual
result=$(sort --field-separator=' ' --key=3.7,3.10 --key=3.4,3.5 --key=3.1,3.2 ISIN| head -n 3)
# if input contain header line following line will take that into account, 
# uncomment it, and comment the above line
#result=$(tail -n+2 ISIN| sort --field-separator=' ' --key=3.7,3.10 --key=3.4,3.5 --key=3.1,3.2| head -n 3)

# read output line by line
# and delete exising files named as ISIN
# may be left from previous script run
while IFS='' read -r i || [[ -n "$i" ]]; do
  # extracting first column
  first=${i%% *}
  rm $first &>/dev/null
done <<<$result

# read output line by line
while IFS='' read -r i || [[ -n "$i" ]]; do
  echo "output: $i"
  # extracting first column
  first=${i%% *}
  echo "Writing to file $first"
  # append to a file with first column as a name
  echo "$i" >>$first
done <<<$result

Корректироваться --field-separator=' ' с реальным разделителем, может быть это'', или''; и изменение head -n 3 к желаемому количеству старых строк. Также вход чтений сценария из файла ISIN, замените его своим фактическим именем файла.

Обновление: Сценарий добавляет строки в файлы ISIN, таким образом, на втором выполнении - дублирующиеся строки могут появиться. Я добавил цикл, что удаляет это старые файлы ISIN и создает снова, таким образом, его возможное для выполнения больше затем однажды с корректным результатом. Выходные файлы содержат одну или несколько строк с тем же ISIN.

0
ответ дан 7 December 2019 в 20:48

Другие вопросы по тегам:

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