У меня около 300 файлов в папке, пытаюсь удалить запятую в CSV, когда я запускаю в цикле, я получаю ошибку

МОЙ КОД:

#!/bin/bash
FILES=/home/whoisdat/all-data/*
{

for f in $FILES
do  

{
awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "", $i) } 1' $f > allan-$f
}
done

Ошибка:

root@s1.allheartweb.com [all-data]# sh /home/all-data/unique.sh
/home/whoisdat/all-data/unique.sh: line 12: syntax error: unexpected end of file
0
Amit 20 Янв 2021 в 15:56

2 ответа

Лучший ответ

Правильный способ делать то, что вы делаете:

awk -F'"' -v OFS='' '
    FNR==1 { close(out); out="allan-"FILENAME }
    { for (i=2; i<=NF; i+=2) gsub(/,/, "", $i); print > out }
' /home/whoisdat/all-data/*

Мы закрываем предыдущий выходной файл, когда начинаем читать следующий входной файл, чтобы избежать ошибки «слишком много открытых файлов» из-за большинства awks, когда мы преодолеваем ограничение в дюжину или около того (GNU awk, который может обрабатывать много открытых файлов, страдает замедлением вместо этого, что также нежелательно), и мы закрываем его только там, а не один раз на каждую обрабатываемую строку ввода, чтобы избежать значительного снижения производительности при открытии и закрытии выходных файлов один раз на строку ввода.

Приведенное выше предполагает, что вы не выполняете команду в / home / whoisdat / all-data / и поэтому создаете файлы allan- * в / home / whoisdat / all-data / во время выполнения сценария.

0
Ed Morton 20 Янв 2021 в 17:41
awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "", $i);print $0 >> ("allan-"FILENAME);close("allan-"FILENAME) }' /home/whoisdat/all-data/* 

Нет необходимости зацикливаться на файлах, просто позвольте awk обработать все файлы и используйте FILENAME для отслеживания обрабатываемых файлов.

1
Raman Sailopal 20 Янв 2021 в 17:21