Насколько я понимаю, этот сценарий является частью коммерческого программного обеспечения InstallAnywhere, у которого есть форум здесь . Я нашел похожий скрипт здесь . Я предполагаю, что произошло, когда вы щелкнули по этому файлу, так это то, что вы его открыли, и то, что вы разместили в своем вопросе, — это не все, что там было, так как в этом сценарии было гораздо больше, и даже то, что вы разместили, выглядело по-другому.. (Я прав?)
Другой найденный мной скрипт, более ранней версии, довольно длинный и сложный, поэтому без особого анализа могу дать вам следующий совет.
Но я добавлю еще несколько пунктов, поскольку я углубился в эту тему.
Я не знаю, как это должно работать, я имею в виду, где в цепочке программного обеспечения находится его место. Если он выполняется чем-то другим или должен выполняться сам. Если вы хотите выполнить его самостоятельно, то не нажимайте на него, а проверьте из командной строки , если он имеет права на выполнение , а затем выполните его . Он должен иметь встроенную отладку -, так что вы должны получить некоторые подсказки, которые помогут вам в дальнейшем, если он не работает.
Рассматриваемый файл свойств из того, что я вижу здесь , требует формы:
property=value
Итак, вам нужно определить хотя бы эти два:
lax.class.path=
lax.nl.java.launcher.main.class=
Как вы его создаете? В Linux есть много способов. Вы можете попробоватьvi
(сложный ),vim
(менее сложный ),nano
(довольно простой ), или вы можете использовать графический интерфейс, например gedit
.
Что касается файла .jar
, это архивный файл Java.
Надеюсь, это немного поможет. Опять же, с любыми вопросами лучше обращаться на специализированный форум поставщиков.
Вы упомянули, что это вопрос для интервью. Если бы меня спросили об этом на собеседовании, я бы задавал вопросы об ограничениях, например, почему они у нас есть, что разрешено, а что нет, в чем причина. По каждому вопросу я пытался установить связь с тем, почему у нас есть ограничения в бизнес-контексте, чтобы действительно понять, что здесь происходит.
Кроме того, я хотел бы спросить о происхождении формулы для скорости животного, но это только потому, что мое образование в области физических наук сильнее, чем мое образование в области наук о жизни, и мне это любопытно.
Мне как интервьюеру очень хотелось бы услышать, что существуют стандартные инструменты для парсинга CSV. Я бы особенно хотел услышать, что синтаксический анализ / обработка с нуля с использованием сценариев или утилит командной строки менее желателен, чем использование стандартных инструментов, таких как pandas
и csv
.
Stack Exchange не подходит для такого типа повторяющихся вопросов и ответов, поэтому вместо этого я просто опубликую ответ, используя Python, который я бы предоставил на собеседовании только после того, как действительно разберусь в бизнес-проблеме.
# Assume it's OK to import sqrt, otherwise the spirit of the problem isn't understood.
from math import sqrt
# Read data into dictionary.
dino_dict = dict()
for filename in ['file1.csv','file2.csv']:
with open(filename) as f:
# Read the first line as the CSV headers/labels.
labels = f.readline().strip().split(',')
# Read the data lines.
for line in f.readlines():
values = line.strip().split(',')
# For each line insert the data in the dict.
for label, value in zip(labels, values):
if label == "NAME":
dino_name = value
if dino_name not in dino_dict:
dino_dict[dino_name] = dict() # New dino.
else:
dino_dict[dino_name][label] = value # New attribute.
# Calculate speed and insert into dictionary.
for dino_stats in dino_dict.values():
try:
stride_length = float(dino_stats['STRIDE_LENGTH'])
leg_length = float(dino_stats['LEG_LENGTH'])
except KeyError:
continue
dino_stats["SPEED"] = ((stride_length / leg_length) - 1) * sqrt(leg_length * 9.8)
# Make a list of dinos with their speeds.
bipedal_dinos_with_speed = list()
for dino_name, dino_stats in dino_dict.items():
if dino_stats.get('STANCE') == 'bipedal':
if 'SPEED' in dino_stats:
bipedal_dinos_with_speed.append((dino_name, dino_stats['SPEED']))
# Sort the list by speed and print the dino names.
[dino_name for dino_name, _ in sorted(bipedal_dinos_with_speed, key=lambda x: x[1], reverse=True)]
['Tyrannosaurus Rex', 'Velociraptor', 'Struthiomimus', 'Hadrosaurus']
A g awk
, но выполняется начальная join
, а затем окончательная внутренняя сортировка поawk
join -t, <(sort file1.csv) <(sort file2.csv) |
awk -F, -v g=9.8 '/bipedal/{osaur[$1]=($4/$2-1)*sqrt(g*$2)}
END{PROCINFO["sorted_in"]="@val_num_desc"; for (d in osaur) print d}'
Tyrannosaurus Rex
Velociraptor
Struthiomimus
Hadrosaurus
Изменить для комментария @Cbhihe
Полезный ресурс по управлениюgawk
сканированием массивов .
PROCINFO["sorted_in"]
можно настроить для управления последовательностью чтения массива.
В этом случае нужно использовать @val
ue, предполагая, что они num
eric, и сортировать их по desc
окончанию, следовательно, @val_num_desc
.
Массив также может быть выведен с использованием @ind
льдов, предполагая, что они являются str
ингами, и отсортировать их asc
, заканчивающиеся, и в этом случае это было бы@ind_str_asc
Любая комбинация этих мух и все они находятся в связанном ресурсе.
Решение bu5hman хорошее, и его можно сделать более удобочитаемым и модифицируемым, переработав его следующим образом:
$ join -t, <(sort file1.csv) <(sort file2.csv) |
awk -F, -v g=9.8 '/bipedal/{osaur[$1]=($4/$2-1)*sqrt(g*$2);
print $1 "=" osaur[$1]; }' | sort -t= -rnk2
Результат:
Tyrannosaurus Rex=6.45447
Velociraptor=5.38445
Struthiomimus=1.37078
Hadrosaurus=0.571548
ПРИМЕЧАНИЕ. :направить приведенный выше результат в cut -d= -f1
, чтобы отображались только имена.
Вы могли бы использовать великого Миллера и бежать
mlr --csv join -j NAME -f file1.csv \
then put '$speed=($STRIDE_LENGTH/LEG_LENGTH - 1)*pow(($LEG_LENGTH*9.8),0.5)' \
then sort -nr speed \
then cut -f NAME file2.csv
получить
NAME
Tyrannosaurus Rex
Velociraptor
Euoplocephalus
Stegosaurus
Hadrosaurus
Struthiomimus
Это инструмент, который вы можете использовать почти в каждой ОС и сценарии через bash (и другие языки сценариев ). И это как вырезать/вставить/sed/awk.
Для этой цели были созданы некоторые инструменты. Вот пример:
$ csvq 'select * from cities'
+------------+-------------+----------+
| name | population | country |
+------------+-------------+----------+
| warsaw | 1700000 | poland |
| ciechanowo | 46000 | poland |
| berlin | 3500000 | germany |
+------------+-------------+----------+
$ csvq 'insert into cities values("dallas", 1, "america")'
1 record inserted on "C:\\cities.csv".
Commit: file "C:\\cities.csv" is updated.
Вы упомянули, что Python разрешен.
Это довольно просто, поскольку Python включает встроенную поддержку sqlite3. Вот ссылка на документацию :https://docs.python.org/3/library/sqlite3.html. Все, что вам нужно сделать, это создать таблицу SQL для вашего CSV-файла, используя первую строку в качестве имен столбцов, и вставить данные. Оттуда вы можете запустить столько операторов select, сколько захотите.
Если вам нужно, чтобы что-то было числом вместо текста, попробуйте отсканировать данные и проверить, возможно ли преобразовать каждую ячейку в целое число или число с плавающей запятой, и если да, то вы знаете, какой должен быть ее тип, если вы можете выполнить преобразование для всех ячейки в столбце.