Хорошо, я все еще не понимаю, что произошло или почему, но я нашел лекарство от этого. Думая, я запустил kmenuedit, перешел в раздел «Офис» и отредактировал каждый значок приложения для каждого отдельного приложения AOO. В частности, я заменил такие вещи, как «openoffice4 -calc% U» на «/ usr / bin / openoffice4 -calc% U», а затем сохранил каждую из них. Это устранило проблему щелчка по файлам .odt и запуска AOO. Однако это не заставило работать значки, сохраненные как «Избранное» в средстве запуска приложений KDE. Но после того, как я удалил каждую из них из «Избранное» и снова добавил их, они снова заработали.
Итак, я подозреваю, что что-то было повреждено, и повторное сохранение ссылок запуска в kmenuedit обновило «что-то» и решило проблему. Но я недостаточно знаю, как работает KDE, чтобы понять, что именно происходит.
Я использовал команду awk. моя проблема заключалась в том, что каждая строка отличается от других. Поэтому я понятия не имел о номерах столбцов; Я решил это, добавив тест, чтобы найти правильный номер строки для отображения. Вот мой код:
awk '
BEGIN {
# Set awk script delimiter
FS=",";
# Set CSV file separator
OFS=";";
# Set header part in csv file
print "Method; UserId; ClientId; intent; time"
}
/'clientId'/
{
i=1;
msg="";
while(i<=NF) {
if ($i ~ /clientId/) {
# Cleaning column value :
gsub(/\\n\s{1,}clientId:\s/, "",$i);
msg = msg $i ";"
};
if ($i ~ /"time"/) {
# Cleaning column value :
gsub(/"time":/, "",$i);
msg = msg $i ";"
};
if ($i ~ /intent/) {
# Cleaning column value :
gsub(/\\n\s{1,}intent:\s{1,}/, "",$i);
msg = msg $i ";"
};
if ($i ~ /Method/) {
# Cleaning column value :
gsub(/(^(.*?)|\s{1,})Method\s{1,}?:?\s{1,}/, "",$i);
gsub (/(\s{1,}\{\s{1,}userId.*)?/, "", $i);
msg = msg $i ";"
};
if ($i ~ /userId/) {
# Cleaning column value :
gsub(/(^(.*?)|\s{1,})userId:\s/, "",$i);
msg = msg $i ";"
};
i++
} print msg
}
END {
print NR
} '
$(grep -l id *.log) >> output.csv
Попробуйте это,
awk -F "['\"]" 'NF>=26{print $19","$21","$26","$17}' file.csv
5003700557,YesIntent,2019-01-21T12:23:10.323Z,AFC5EH5PIHHLO4XS7SG
['\"]
чтобы в качестве разделителей использовались как одинарные, так и двойные кавычки. NF>=26
просто чтобы проверить, что в строке больше или равно 26 полям. Для надежного анализа данных, закодированных в формате JSON -, вам потребуется кодек JSON. Это в значительной степени означает Perl или Python (или Ruby... ). Так как я парень Perl, вот решение Perl.
Сначала один -вкладыш:
$ perl -MJSON -ne 'BEGIN { print("clientId;intent;time;userId\n"); } eval { my $obj = from_json($_); my $msg = $obj->{msg}; $msg =~ s/^.*{\s*|\s*,\s*}.*$//g; my %m = map { m/^([^:]*):\s*(.*)/; ($1, $2) } split(/,\s+/, $msg); print("$m{clientId};$m{intent};$obj->{time};$m{userId}\n"); }; warn($@) if ($@);' <x
clientId;intent;time;userId
5003700557;YesIntent;2019-01-21T12:23:10.323Z;AFC5EH5PIHHLO4XS7SG
Так как это несколько избыточно даже для Perl, вот также удобочитаемый скрипт:
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
print("clientId;intent;time;userId\n");
while (<>) {
# Don't choke on malformed lines
eval {
my $obj = from_json($_);
my $msg = $obj->{msg};
$msg =~
s/^.*{\s* # Trim up to and including the leading '{'
|
\s*,\s*}.*$ # Trim trailing ',}'
//gx;
# Split $msg into key-value pairs
my %m = map {
m/^([^:]*) # Stuff that isn't ':'
:\s* # Field separator
(.*) # Everything after the separator
/x;
($1, $2)
} split(/,\s+/, $msg);
print("$m{clientId};$m{intent};$obj->{time};$m{userId}\n");
};
warn($@) if ($@);
}