Как убрать разрыв строки в строках с 10 столбцами, разделенными запятой - PullRequest
0 голосов
/ 01 мая 2020

Мне нужно удалить разрыв строки в каждой строке с 10 столбцами, разделенными запятыми. Это ввод:

EXP_TRANSF_DE_PARA,N/A,Input,1,1,1,04/30/2020 19:52:20,1588287140,11131,Transformation [EXP_TRANSF_DE_PARA] had an error evaluating variable column [v_NUFONE]. Error message is [<<Expression Error>> [TO_INTEGER]: decimal operation overflow
... i:TO_INTEGER(u:RTRIM(u:LTRIM(u:'6711630149',u:' ���'),u:' ���'),i:0)].,3,N/A,N/A,N/A,-1,-1,N/A
EXP_TRANSF_DE_PARA,N/A,Input,1,2,1,04/30/2020 19:52:20,1588287140,11131,Transformation [EXP_TRANSF_DE_PARA] had an error evaluating variable column [v_NUFONE]. Error message is [<<Expression Error>> [TO_INTEGER]: decimal operation overflow
... i:TO_INTEGER(u:RTRIM(u:LTRIM(u:'6342311300',u:' ���'),u:' ���'),i:0)].,3,N/A,N/A,N/A,-1,-1,N/A
PREST_TELEFONE_HIS,N/A,Input,1,3,1,04/30/2020 19:52:20,1588287140,8361,Error loading row to target table [PREST_TELEFONE_HIS]. Error message [
FnName: Execute -- [IBM][CLI Driver][DB2] SQL0407N  Assignment of a NULL value to a NOT NULL column ""*N"" is not allowed.  SQLSTATE=23502
],2,N/A,N/A,N/A,-1,-1,N/A

Это должен быть вывод:

EXP_TRANSF_DE_PARA,N/A,Input,1,1,1,04/30/2020 19:52:20,1588287140,11131,Transformation [EXP_TRANSF_DE_PARA] had an error evaluating variable column [v_NUFONE]. Error message is [<<Expression Error>> [TO_INTEGER]: decimal operation overflow... i:TO_INTEGER(u:RTRIM(u:LTRIM(u:'6711630149',u:' ���'),u:' ���'),i:0)].,3,N/A,N/A,N/A,-1,-1,N/A
EXP_TRANSF_DE_PARA,N/A,Input,1,2,1,04/30/2020 19:52:20,1588287140,11131,Transformation [EXP_TRANSF_DE_PARA] had an error evaluating variable column [v_NUFONE]. Error message is [<<Expression Error>> [TO_INTEGER]: decimal operation overflow... i:TO_INTEGER(u:RTRIM(u:LTRIM(u:'6342311300',u:' ���'),u:' ���'),i:0)].,3,N/A,N/A,N/A,-1,-1,N/A
PREST_TELEFONE_HIS,N/A,Input,1,3,1,04/30/2020 19:52:20,1588287140,8361,Error loading row to target table [PREST_TELEFONE_HIS]. Error message [FnName: Execute -- [IBM][CLI Driver][DB2] SQL0407N  Assignment of a NULL value to a NOT NULL column ""*N"" is not allowed.  SQLSTATE=23502],2,N/A,N/A,N/A,-1,-1,N/A

До сих пор я пробовал эту команду awk:

awk -F"," 'NF=10{printf("%s",$0);getline;print;next}1'

Вывод :

EXP_TRANSF_DE_PARA N/A Input 1 1 1 04/30/2020 19:52:20 1588287140 11131 Transformation [EXP_TRANSF_DE_PARA] had an error evaluating variable column [v_NUFONE]. Error message is [<<Expression Error>> [TO_INTEGER]: decimal operation overflow... i:TO_INTEGER(u:RTRIM(u:LTRIM(u:'6711630149',u:' ���'),u:' ���'),i:0)].,3,N/A,N/A,N/A,-1,-1,N/A
EXP_TRANSF_DE_PARA N/A Input 1 2 1 04/30/2020 19:52:20 1588287140 11131 Transformation [EXP_TRANSF_DE_PARA] had an error evaluating variable column [v_NUFONE]. Error message is [<<Expression Error>> [TO_INTEGER]: decimal operation overflow... i:TO_INTEGER(u:RTRIM(u:LTRIM(u:'6342311300',u:' ���'),u:' ���'),i:0)].,3,N/A,N/A,N/A,-1,-1,N/A
PREST_TELEFONE_HIS N/A Input 1 3 1 04/30/2020 19:52:20 1588287140 8361 Error loading row to target table [PREST_TELEFONE_HIS]. Error message [FnName: Execute -- [IBM][CLI Driver][DB2] SQL0407N  Assignment of a NULL value to a NOT NULL column *N is not allowed.  SQLSTATE=23502
] 2 N/A N/A N/A -1 -1 N/A  ] 2 N/A N/A N/A -1 -1 N/A

Я не знаю, почему команда удаляет разделитель запятых из строк. Я знаю, что в 6-й строке нет 10 столбцов, поэтому не удаляется строка разрыва ... Любые советы?

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Попробуйте это

awk -F","  '{OFS=",";  if ($3 != "Input") {printf "%s", $0} else {printf "\n%s" ,$0}}' |sed '1d'  | sed  -e '$a\'

Демонстрация:

$cat file.txt 
EXP_TRANSF_DE_PARA,N/A,Input,1,1,1,04/30/2020 19:52:20,1588287140,11131,Transformation [EXP_TRANSF_DE_PARA] had an error evaluating variable column [v_NUFONE]. Error message is [<<Expression Error>> [TO_INTEGER]: decimal operation overflow
... i:TO_INTEGER(u:RTRIM(u:LTRIM(u:'6711630149',u:' ���'),u:' ���'),i:0)].,3,N/A,N/A,N/A,-1,-1,N/A
EXP_TRANSF_DE_PARA,N/A,Input,1,2,1,04/30/2020 19:52:20,1588287140,11131,Transformation [EXP_TRANSF_DE_PARA] had an error evaluating variable column [v_NUFONE]. Error message is [<<Expression Error>> [TO_INTEGER]: decimal operation overflow
... i:TO_INTEGER(u:RTRIM(u:LTRIM(u:'6342311300',u:' ���'),u:' ���'),i:0)].,3,N/A,N/A,N/A,-1,-1,N/A
PREST_TELEFONE_HIS,N/A,Input,1,3,1,04/30/2020 19:52:20,1588287140,8361,Error loading row to target table [PREST_TELEFONE_HIS]. Error message [
FnName: Execute -- [IBM][CLI Driver][DB2] SQL0407N  Assignment of a NULL value to a NOT NULL column ""*N"" is not allowed.  SQLSTATE=23502
],2,N/A,N/A,N/A,-1,-1,N/A
$awk -F","  '{OFS=",";  if ($3 != "Input") {printf "%s", $0} else {printf "\n%s" ,$0}}' file.txt  | sed '1d'  | sed  -e '$a\'
EXP_TRANSF_DE_PARA,N/A,Input,1,1,1,04/30/2020 19:52:20,1588287140,11131,Transformation [EXP_TRANSF_DE_PARA] had an error evaluating variable column [v_NUFONE]. Error message is [<<Expression Error>> [TO_INTEGER]: decimal operation overflow... i:TO_INTEGER(u:RTRIM(u:LTRIM(u:'6711630149',u:' ���'),u:' ���'),i:0)].,3,N/A,N/A,N/A,-1,-1,N/A
EXP_TRANSF_DE_PARA,N/A,Input,1,2,1,04/30/2020 19:52:20,1588287140,11131,Transformation [EXP_TRANSF_DE_PARA] had an error evaluating variable column [v_NUFONE]. Error message is [<<Expression Error>> [TO_INTEGER]: decimal operation overflow... i:TO_INTEGER(u:RTRIM(u:LTRIM(u:'6342311300',u:' ���'),u:' ���'),i:0)].,3,N/A,N/A,N/A,-1,-1,N/A
PREST_TELEFONE_HIS,N/A,Input,1,3,1,04/30/2020 19:52:20,1588287140,8361,Error loading row to target table [PREST_TELEFONE_HIS]. Error message [FnName: Execute -- [IBM][CLI Driver][DB2] SQL0407N  Assignment of a NULL value to a NOT NULL column ""*N"" is not allowed.  SQLSTATE=23502],2,N/A,N/A,N/A,-1,-1,N/A
$

Объяснение:

awk -F"," <- Установить разделитель как <code>,

'{OFS=","; <- установить разделитель выходного поля как <code>,, потому что мы будем использовать printf для форматирования текста

if ($3 != "Input") {printf "%s", $0} <- если 3-й столбец текущей записи не <code>"Input" print текущая запись. Обратите внимание, что мы не добавляем newline, поэтому запись не будет прекращена.

else {printf "\n%s" ,$0}}' <- Если текущая запись имеет запись, мы хотим добавить разрыв строки <code>\n перед печатью записи.

sed '1d' <- удалить первую запись. Это будет пустая строка, поскольку наша запись имеет «Input» </p>

sed -e '$a\' <- добавить новую строку в конец файла. </p>

1 голос
/ 01 мая 2020

Вот скрипт Bash, который решает вашу проблему:

#!/bin/bash

set -o errexit
set -o nounset

fieldCount=20

#filter out newlines which are not record separators
fieldNum=1
while read -N1 -r ch; do
    if [ "$ch" = "," ]; then
        fieldNum="$((fieldNum + 1))"
    elif [ "$ch" = $'\n' ] && [ "$fieldNum" = "$fieldCount" ]; then
        fieldNum=1
    fi
    if [ "$ch" != $'\n' ] || [ "$fieldNum" = 1 ]; then
        printf "$ch"
    fi
done
printf '\n'

Опция -N1 читает один символ за раз (вместо одной строки за раз), а опция -r обрабатывает backsla sh как обычный символ.

Проблема также может быть решена с помощью простой C программы сопоставимого размера:

#include <stdio.h>

int main(void)
{
    const int fieldCount = 20;
    int fieldNum, ch;

    /*filter out newlines which are not record separators*/
    fieldNum = 1;
    ch = getchar();
    while (ch != EOF) {
        if (ch == ',') {
            fieldNum++;
        } else if ((ch == '\n') && (fieldNum == fieldCount)) {
            fieldNum = 1;
        }
        if ((ch != '\n') || (fieldNum == 1)) {
            putchar(ch);
        }
        ch = getchar();
    }
    putchar('\n');
    return 0;
}
...