вы можете попробовать это.
Я выполняю 1 awk на исходный файл.Поместите содержимое во временный файл (в каждом процессе это серия разных, чтобы избежать конфликта в одном и том же конечном файле и / или слишком много дескриптора открытия / закрытия для него).В конце awk он помещает содержимое временного файла в окончательный и удаляет временный
. Возможно, вам придется использовать ограничитель пакетов (режим сна или более интеллектуальную группировку), если есть много файлов для обработкичтобы избежать остановки машины при слишком большом количестве одновременных подпроцессов.
rm output/*.csv
for File in mydir/*.csv
do
# shell sub process
{
# ref for a series of temporary file
FileRef="${File##*/}"
awk -F ',' -v FR="${FileRef}" '
NF == 29 {
# put info in temporary file
ListFiles [ OutTemp = "output/"$2".csv_" FR ] = "output/"$2".csv"
print > OutTemp}
END {
# put temporary content into final file
for ( TempFile in ListFiles ) {
Command = sprintf( "cat \042%s\042 >> \042%s\042; rm \042%s\042" \
, TempFile, ListFiles[TempFile], TempFile )
printf "" | Command
}
' File
} &
done
wait
echo ls -l output/*.csv