Поэтому я пытался создать программу, которая считывает содержимое 5 файлов CSV с именем exportexec, потому что не знаю, куда его поставить. Вот код:
#!/bin/bash
tc=1
for file_index in `ls export*.csv`
do
if [ $tc -eq 1 ]; then
fline=`head -1 export1.csv`
echo $fline > merged.csv
let "tc++"
else
sed 1d | while read riga; do
echo "$riga,$file_index" >> merged.csv
done < $file_index
fi
done
Проблема в том, что я не знаю, где правильно поставить exec. Первая строка должна быть пропущена (кроме первого раза), потому что объединенный.csv должна иметь первую строку в качестве описания поля. Файлы CSV структурированы таким образом: имя, фамилия, product_code в первой строке, а затем данные. Но как я могу правильно пройти через них?
Пожалуйста, добавьте образец ввода и желаемый результат для этого образца ввода к вашему вопросу.
Возможный дубликат Unix: объединить несколько файлов CSV с одинаковым заголовком, сохранив заголовок первого файла. Вам не нужно exec в вашем сценарии.
Ваше решение слишком сложно, по крайней мере, на один порядок (если вы не делаете это в качестве расширенного упражнения по изучению сценария оболочки) ;-) .. Предполагая, что вы имеете в виду, что ваши файлы уже пронумерованы в правильной последовательности, т.е. f01.txt, f02.txt, f03.txt,... тогда cat f01.txt > merged.txt; mv f01.txt f01.HID ; sed '1d' f*.txt >> merged.txt; mv f01.HID f01.txt будет решить заявленную проблему. Сначала научитесь использовать доступные команды ;-) Удачи. И ++ за использование форматирования кода в вашем первом Q!
Дополнительный : . Обратите внимание, что если вы сохранили файлы как f1.txt, f2.txt...., то f11.txt испортит это решение. Так что назовите свои файлы защитно (с ведущими нулями, чтобы сохранить правильную сортировку имен файлов по умолчанию) ;-)
я буду совершенствоваться, тем более, что мне нужно учиться awk. Спасибо всем!





попробуй это:
#!/bin/bash
HEADER = "name,surname,product_code" # define header
MERGED = "merged.csv" # define output file
echo $HEADER > $MERGED # write header in output file
for csv in export*.csv; do # run over all csv's
sed "/$HEADER/d" $csv >> $MERGED # remove first line, append to output file
done
Это работает! Да еще и в несколько строк! Большое спасибо. Я также ценю решение AWK, хотя скрипт более адаптируемый, поэтому мне это решение нравится больше.
В вашем заголовке будет на один столбец меньше, чем в остальных. Кроме того, не используйте
lsв качестве входных данных дляfor, вы создаете совершенно новый процесс, который уже может делать оболочка:for file_index in export*.csv.