Я нуждаюсь в помощи, пишущий сценарий, который извлек бы из основного файла самые старые записи и сохранил бы их в отдельном файле. Файл содержит сотни кодов 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:
Один файл с самой старой записью:
Второй файл с самой старой записью:
3-й с самыми старыми записями - оба с той же датой:
Даты находятся в DD/MM/YYYY формате (теперь, когда я смотрю на него в Libre I, видят, что формат даты изменился на MM/DD/YYYY - но что я могу корректироваться позже).
Попробуйте это,
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
Вы показываете примеры в графическом интерфейсе, в простом тексте должны быть разделители между столбцами, я использовал пространство как разделитель, замените его в сценарии с фактическим.
Здесь файл, что я использовал в качестве примера:
$ 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.