Объединение нескольких файлов и разделение вывода на несколько файлов в каждом столбце (запись 2) - PullRequest
0 голосов
/ 06 мая 2019

У меня есть много CSV-файлов с одинаковым форматом в строках и столбцах. В приведенном ниже примере я представляю только 2 файла в качестве входных данных, но у меня много файлов с такими же характеристиками

Цель каждого входного файла:

Взять значение в строках 1, 2 и 3.

пример в первом файле

6174
15
3

Затем выведите первый столбец из строки 4 в 6.

Выполните один и тот же процесс для всех входных файлов и выведите файл со всей информацией обо всех прочитанных файлах.

Когда процесс завершен для всех файлов и первого столбца. Сделайте то же самое с остальными столбцами

В итоге общее количество созданных выходных файлов составит 4 файла, поскольку в каждом файле по 4 столбца.

Input1

Record Number 6174
Vibrator Identification 15
Start Time Error 3 us
1.6,19.5,,,
1.7,23.2,28.3,27.0
1.8,26.5,27.0,25.4

Input2

Record Number 6176
Vibrator Identification 17
Start Time Error 5 us
1.6,18.6,,,
1.5,23.5,19.7,19.2
1.3,26.8,19.2,18.5

Используя приведенный ниже код, я получил 4 выходных файла по желанию, хотя файлы 3-4 не так хороши, как предполагалось, потому что в первых строках есть пустые значения и мой код работает не так, как предполагалось. Также у меня есть проблема, чтобы получить правильное значение в строке 3 в каждом файле .. Я получаю нас вместо числа.

выходной файл1

6174,15,3,1.6,1.7,1.8
6176,17,5,1.6,1.5,1.3

выходной файл2

6174,15,3,19.5,23.2,26.5
6176,17,5,18.6,23.5,26.8

выходной файл3

6174,15,3,0,0,28.3,27.0
6176,17,5,0,0,19.7,19.2

выходной файл4

6174,15,3,0,0,27.0,25.4
6176,17,5,0,0,19.2,18.5

используемый код

Код работает почти нормально, объедините csv-файлы и выведите 4 файла, но есть проблема для файлов 3-4, когда есть пустые значения.

        for f in *.csv ; do

        awk -F, 'NR==1 {n=split($NF,f," ");print f[n]}' "$f" >> a-"$f"
        awk -F, 'NR==2 {n=split($NF,f," ");print f[n]}' "$f" >> a-"$f"
        awk -F, 'NR==3 {n=split($NF,f," ");print f[n]}' "$f" >> a-"$f"
        sed -i  's/\r$//' a-"$f"

        for i in seq $(1...4); do
        awk -F, 'NR>=4{f=1} f{print '"$""$i"'} f==6{exit}' "$f" > "a""$i"-"$f"

            cat a-"$f" a"$i""-""$f" >> t"$i" 

            sed -i  's/\r$//' t"$i" 

        done

                for i in seq $(1...4); do
                awk -v RS= -v OFS=',' -v ORS='\n' '{$1=$1}1' t"$i" > file"$i".csv

    done

done

rm -f ./a*  ./t*

Ценю вашу помощь

1 Ответ

1 голос
/ 07 мая 2019

С GNU awk для ENDFILE и автоматической обработкой нескольких открытых файлов и с учетом того, что опубликованный вами пример вывода показывает, что каждый файл file3 и file4 имеет больше полей, чем file1 и file2, является ошибкой:

$ cat tst.awk
BEGIN { FS=OFS=","; numHdrFlds=3 }
FNR <= numHdrFlds {
    gsub(/[^0-9]/,"")
    hdr = (FNR==1 ? "" : hdr OFS) $0
    next
}
{
    for (i=1; i<=NF; i++) {
        data[i] = (FNR==(numHdrFlds+1) ? "" : data[i] OFS) ($i)+0
    }
}
ENDFILE {
    for ( fileNr=1; fileNr<=NF; fileNr++ ) {
        print hdr, data[fileNr] > ("outputFile" fileNr)
    }
}

.

$ awk -f tst.awk file1 file2

$ for i in outputFile*; do echo "$i"; cat "$i"; echo "---"; done
outputFile1
6174,15,3,1.6,1.7,1.8
6176,17,5,1.6,1.5,1.3
---
outputFile2
6174,15,3,19.5,23.2,26.5
6176,17,5,18.6,23.5,26.8
---
outputFile3
6174,15,3,0,28.3,27
6176,17,5,0,19.7,19.2
---
outputFile4
6174,15,3,0,27,25.4
6176,17,5,0,19.2,18.5
---
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...