добавление столбца в файл CSV с помощью awk

Необходимо было упомянуть страницу справочника tar, просто путем выдачи команды:

man tar

Для Вашего конкретного вопроса вот хороший пример того, как сделать это:

 find /informatica/dev/SrcFiles* -print0 -mtime +7 -and -size +1M | xargs -0 tar cjvf /mydir/mytarfile.tar.bz2

Таким образом, команду tar назовут только однажды, вместо того, чтобы быть названной каждый раз, когда файл найден. Заметьте -print0 и -0 аргументы. Это избежит разделения слова...

Кроме того, необходимо удостовериться, что архив не размещается в тот же каталог, в то время как его имя может подойти в шаблоне поиска. Вы получите ошибку при предположении, что Вы не можете добавить архив к себе!

3
28.08.2015, 08:12
2 ответа

Проблема заключается в том, что переменные оболочки (включая массивы) недоступны внутри awk . Их необходимо явно передать с помощью параметра -v . Более того, вы не можете передать весь массив, но вы можете поместить массив в одну переменную и разбить его внутри awk :

awk -va="$(echo "${array[@]}")" 'BEGIN{OFS=FS=","; split(a,b," ")}{print $0,b[NR]}' input.csv

Это будет работать, пока у вас нет пробелов внутри элементов массива.

0
27.01.2020, 21:19

Нужно ли для этого использовать awk ? Утилита paste была разработана именно для такого рода вещей. Предполагая, что array является массивом оболочки:

array=(100 200)
printf "%s\n" "${array[@]}" | paste -d, input.csv - > output.csv

printf просто помещает каждый член массива в новую строку. paste затем вставляет вместе входные строки из input.csv и - (то есть вывод по конвейеру из printf ), используя запятую в качестве разделителя.


Если ваш массив является файлом, разделенным новой строкой, например array.txt:

100
200

, тогда это еще проще:

paste -d, input.csv array.txt > output.csv
4
27.01.2020, 21:19

Теги

Похожие вопросы