Чистое bash
решение, использующее только практически универсально доступные системные команды:
timeout() {
if (( $# < 3 )); then
printf '%s\n' 'Usage: timeout sigterm-seconds sigkill-seconds command [arg ...]'
return 1
fi
"${@:3}" &
pid=$!
sleep "$1"
if ps "${pid}" >/dev/null 2>&1; then
kill -TERM "${pid}"
sleep "$2"
if ! ps "${pid}" >/dev/null 2>&1; then
printf '%s\n' "Process timed out, and was terminated by SIGTERM."
return 2
else
kill -KILL "${pid}"
sleep 1
if ! ps "${pid}" >/dev/null 2>&1; then
printf '%s\n' "Process timed out, and was terminated by SIGKILL."
return 3
else
printf '%s\n' "Process timed out, but can't be terminated (SIGKILL ineffective)."
return 4
fi
fi
else
printf '%s\n' "Process exited gracefully before timeout."
fi
}
Затем запустите как timeout sigterm-seconds sigkill-seconds команду [arg ...]
.
Допустим, ваш CSV-файл называется «list.csv». Я бы сделал так:
#!/bin/bash
echo -e "Keyobject","Are you sleeping ", " Country of meeting" # create new header
cat list.csv | sed 1,1d | awk -F, 'NF>1{print $NF}' | paste -d', ' - - | sed 's/ /,/' | nl
1 yes,USA
2 ' ', ' '
3 yes,CHINA
4 yes,ITALY
Пояснение:
sed 1,1d # This command excludes the original header in list.csv
awk -F, 'NF>1{print $NF}' # This command reads the last word in each row
paste -d', ' - - # This command paste the words beside each other
sed 's/ /,/' # This command replaces blank spaces with commas
nl # This command adds numbering to the rows in the final output
Однако это решение предполагает, что строки в исходном CSV-файле организованы так, как показано в приведенном выше примере.
awk <file -v IV="' '" -v OV=" " -F, '
$1+0 {
b = $2 == IV ? OV : $2
a[$1,$2] = $3 == IV ? OV : $3
if($1 > max) max = $1; t[$2]++;
}
END{
ORS = ""
print "Keyobject"
for(k in t) print FS k
print RS
for(i = 1; i <= max; i++){
print i
for(k in t)
print FS (i SUBSEP k in a ? a[i,k] : OV)
print RS
}
}
'
Настройте переменные IV
и OV
для того, какое пустое поле должно быть на входе и выходе соответственно.
Попробуйте также
awk -F, -v OFS="," '
NR == 1 {HD = "Keyobject,are you sleeping,country of meeting"
for (MX=n=split (HD, HDArr, OFS); n>0; n--) SRCH[HDArr[n]]
print HD
next
}
$2 in SRCH {RES[$2] = $3
RES[HDArr[1]] = $1
}
NR%2 {for (i=1; i<=MX; i++) printf "%s%s", RES[HDArr[i]], (i == MX)?ORS:OFS
split ("", RES)
}
' file
Keyobject,are you sleeping,country of meeting
1,yes,USA
2,' ',' '
3,yes,CHINA
4,yes,ITALY
При чтении строки 1 создается заголовок и массив поиска, индексированный элементами заголовка, и печатается заголовок. В следующих строках массиву результатов, индексированному по $2, присваивается значение $3, причем избыточно для строки индекса «Keyobject». Для каждой второй строки выводится результат, а массив результатов удаляется.
awk -F, '
NR > 1 {ids[$1]; keys[$2]; value[$1,$2] = $3}
END {
printf "Keyobject"
for (k in keys)
printf ",%s", k
print ""
for (id in ids) {
printf id
for (k in keys)
printf ",%s", value[id,k]
print ""
}
}
' file