Да, просто удалите скобки и запятые, и готово.
mv "test.csv" "bob.csv" "foobar.csv" /file/path
Ответ на вторую часть -преобразование файлов json в таблицу.
Использование:./json_to_table.sh *.json
#!/bin/bash
for i in "$@"; do
file_content=$(sed -n 's/".*":"\(.*\)",\?/\1/p' "$i" | tr '\n' ' ')
printf "%s %s\n" "$i" "$file_content"
done | column -t
Если вам не нужен красивый формат таблицы, вы можете удалить | column -t
часть (внизу, послеdone
). Тогда поля строки будут разделены одним пробелом, следовательно, каждое будет иметь свою ширину. Он хорош для парсинга программами типа awk
, sed
, но неудобен для чтения человеком.
Примечание:после каждой записи в файле json, кроме последней, должна стоять запятая. Что я имею в виду:
"field8":"310000", <- here
"field9":"si", <-here
"field10":"2017-06-05" <- not here. Last record without comma.
}
for file in *; do
awk 'BEGIN { print "{" } END { print "\n}" } { printf( "%s",newrec); printf( "\"field%d\": \"%s\"", NR, $0); newrec=",\n" }' "$file" > "${file}.json"
done
NR
— количество записей (или строк )в файле, которые уже были обработаны. Это 1
при работе в первой строке, 2
во второй строке и так далее.
$0
— вся неизмененная входная запись (или строка ).
Если имена полей совпадают, вы можете определить массив (e. г.labels[]
)в строфе BEGIN
, а затем обращаться к ним по индексу (e. г.labels[NR]
).
Я бы решил эту проблему с помощьюинструмента jq(подходящего инструмента для анализа/манипулирования JSON):
for f in *; do
jq -R -s 'rtrimstr("\n") | split("\n") | to_entries | reduce.[] as $o ({};.["field" + ($o.key+1|tostring)] |= $o.value )' "$f" > "$f".json;
done
-R
(--raw-input
)в сочетании с-s
(--slurp
)-передать все входные данные в фильтр как одну длинную строку Итак, окончательный сценарий для первой части:
for file in facturas/*; do
awk 'BEGIN {
split("fechae tpago ruc nfactura total iva10 iva5 iva0 archivado fechap",campos)
print "{"
}
END {
print "\n}"
}
{
printf( "%s",newrec)
printf( "\"%s\":\"%s\"", campos[NR], $0)
newrec=",\n"
}' "$file" > "${file}.json"
done
И окончательный результат для второй части:
#!/bin/bash
for i in "$@"; do
printf "%s " "$i"
sed -n 's/".*":"\(.*\)"/\1/p' "$i" | tr ',\n' ' '
echo
done | column -t
Спасибо всем за проявленный интерес.