2016-01-14 3 views
0

Мы получили 18 000 CSV-файлов, каждый из которых содержит 2 строки текста.Редактирование csv-файла

Эти две линии должны были быть одной линией, разделенной запятой.

FK1QG5QL
b8: 9d: 7d

должен появиться

FK1QG5QL, b8: 9d: 7d

Я пытаюсь удалить возвращения из первую строку и замените ее запятой.

+0

вопрос был отредактирован. Сожалею. – cducasse

ответ

1

Будет ли это работать?

for f in *.csv; do awk 'BEGIN {l=""} !/^ *$/ {if (l!="") {l=l","}; l=l$0} END {print l}' "$f"; done 

Вы можете перенаправить вывод выше команды в файл:

for f in *.csv; do awk 'BEGIN {l=""} !/^ *$/ {if (l!="") {l=l","}; l=l$0} END {print l}' "$f"; done > combined 

Если вы хотите изменить каждый файл, который вы можете использовать следующую версию. Это создаст новый файл с именем * .copy:

for f in *.csv; do awk 'BEGIN {l=""} !/^ *$/ {if (l!="") {l=l","}; l=l$0} END {print l}' "$f" > "$f".copy; done 
+0

не будет работать только в том случае, если это имена файлов? – cducasse

+0

Если вы правильно поняли: у вас есть 18000 файлов CSV с двумя строками в каждом из них, и вы хотите объединить каждую строку в каждом файле в одну строку, разделенную запятой. Это верно? Команда в моем ответе берет список файлов в текущем каталоге, читает их и возвращает все строки в каждом файле, объединенные в одну строку, разделенные запятой. – stee1rat

+1

Что создает отдельный выходной файл (без перезаписи исходного файла?) И, конечно же, UUOC, 'awk '... script' $ f' является более эффективным. Всем удачи. – shellter

0

У вас есть команда paste?

for f in *; do 
    mv "$f" "$f.bak" && paste -sd "," "$f.bak" > "$f" 
done 
# test first before uncommenting next line 
# rm *.bak 

Без пасты вы можете попробовать другие решения:

head -1 input.csv | tr '\n' ',' ; tail -1 input.csv 

cat input.csv | tr "\\n" "," | sed 's/,$/\n/' 

printf -v oneline "%s," $(cat input.csv); echo "${oneline%,}" 

sed 'N;s/\n/,/' input.csv 

set -- $(cat input.csv); IFS=,; echo "$*" 
Смежные вопросы