Shell 如何删除以逗号分隔符分隔的10列行中的换行符

Shell 如何删除以逗号分隔符分隔的10列行中的换行符,shell,awk,sh,newline,Shell,Awk,Sh,Newline,我需要删除每行中由逗号分隔符分隔的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_IN

我需要删除每行中由逗号分隔符分隔的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  ] 2 N/A N/A N/A -1 -1 N/A
EXP_TRANSF_DE_PARA N/A输入11 104/30/2020 19:52:20 1588287140 11131转换[EXP_TRANSF_DE_PARA]在计算变量列[v_NUFONE]时出错。错误消息为[[TO_INTEGER]:十进制操作溢出…i:TO_INTEGER(u:RTRIM(u:LTRIM)(u:6711630149',u:���'),u:'���'),i:0),3,不适用,不适用,不适用,-1,-1,不适用
EXP_TRANSF_DE_PARA N/A输入1 2 1 04/30/2020 19:52:20 1588287140 11131转换[EXP_TRANSF_DE_PARA]在计算变量列[v_NUFONE]时出错。错误消息为[[TO_INTEGER]:十进制操作溢出…i:TO_INTEGER(u:RTRIM(u:LTRIM(u:'6342311300',u:'���'),u:'���'),i:0),3,不适用,不适用,不适用,-1,-1,不适用
PREST_TELEFONE_HIS N/A Input 1 3 1 04/30/2020 19:52:20 1588287140 8361将行加载到目标表[PREST_TELEFONE_HIS]时出错。错误消息[FnName:Execute--[IBM][CLI Driver][DB2]SQL0407N不允许将空值分配给非空列*N。SQLSTATE=23502
]2不适用不适用不适用-1-1不适用]2不适用不适用不适用不适用-1-1不适用
我不知道为什么命令要从行中删除逗号分隔符。我知道第6行没有10列,这就是为什么不删除换行符。。。
有什么提示吗?

这里有一个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将反斜杠视为普通字符

这个问题也可以用一个大小相当的简单C程序来解决:

#包括
内部主(空)
{
const int fieldCount=20;
int fieldNum,ch;
/*过滤掉不是记录分隔符的换行*/
fieldNum=1;
ch=getchar();
while(ch!=EOF){
如果(ch==','){
fieldNum++;
}else if((ch='\n')&&(fieldNum==fieldCount)){
fieldNum=1;
}
if((ch!='\n')| |(fieldNum==1)){
putchar(ch);
}
ch=getchar();
}
putchar('\n');
返回0;
}

下面是一个解决您的问题的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将反斜杠视为普通字符

这个问题也可以用一个大小相当的简单C程序来解决:

#包括
内部主(空)
{
const int fieldCount=20;
int fieldNum,ch;
/*过滤掉不是记录分隔符的换行*/
fieldNum=1;
ch=getchar();
while(ch!=EOF){
如果(ch==','){
fieldNum++;
}else if((ch='\n')&&(fieldNum==fieldCount)){
fieldNum=1;
}
if((ch!='\n')| |(fieldNum==1)){
putchar(ch);
}
ch=getchar();
}
putchar('\n');
返回0;
}
试试这个

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
$

$cat file.txt
EXP_TRANSF_DE_PARA,N/A,Input,1,1,04/30/2020 19:52:20158828714011131,转换[EXP_TRANSF_DE_PARA]在计算变量列[v_NUFONE]时出错。错误消息为[[TO_INTEGER]:十进制操作溢出
…i:TO_整数(u:RTRIM(u:LTRIM)(u:6711630149',u:���'),u:'���'),i:0),3,不适用,不适用,不适用,-1,-1,不适用
EXP_TRANSF_DE_PARA,N/A,Input,1,2,1,04/30/2020 19:52:20158828714011131,转换[EXP_TRANSF_DE_PARA]在计算变量列[v_NUFONE]时出错。错误消息为[[TO_INTEGER]:十进制操作溢出
…i:TO_整数(u:RTRIM(u:LTRIM)(u:6342311300',u:���'),u:'���'),i:0),3,不适用,不适用,不适用,-1,-1,不适用
PREST_TELEFONE_HIS,不适用,输入,1,3,1,04/30/2020 19:52:2015882871408361,将行加载到目标表[PREST_TELEFONE_HIS]时出错。错误消息[
FnName:Execute--[IBM][CLI Driver][DB2]SQL0407N不允许将空值赋值给非空列“*N”。SQLSTATE=23502
],2,不适用,不适用,不适用,-1,-1,不适用
$awk-F“,“{OFS=”,“if($3!=“Input”){printf”%s“,$0}else{printf”\n%s“,$0}}”file.txt | sed'1d'| sed-e'$a''
EXP\u TRANSF\u DE\u PARA,N/A,Input,1,1,1,04/30/2020 19:52:20158828714011131,Transformation[EXP\u TRANSF\u DE\u PARA]在计算变量列[v\u NUFONE]时出错。错误消息是[[TO\u INTEGER]:十进制操作溢出…i:TO\u INTEGER(u:RTRIM(u:LTRIM)(u:'6711630149','u:'���'),u:'���'),i:0),3,不适用,不适用,不适用,-1,-1,不适用
EXP_TRANSF_DE_PARA,N/A,Input,1,2,1,04/30/2020 19:52:20158828714011131,转换[EXP_TRANSF_DE_PARA]在计算变量列[v_NUFONE]时出错。错误消息是[[TO_INTEGER]:十进制操作溢出…i:TO_INTEGER(u:RTRIM(u:LTRIM)(u:'6342311300',u:'���'),u:'���'),i:0),3,不适用,不适用,不适用,-1,-1,不适用
PREST_TELEFONE_HIS,N/A,Input,1,3,1,04/30/2020 19:52:2015882871408361,将行加载到目标表[PREST_TELEFONE_HIS]时出错。错误消息[FnName:Execute--[IBM][CLI Driver][DB2]SQL0407N不允许将空值分配给非空列“*N”。SQLSTATE=23502],2,N/A,N/A,N/A,-1,N/A
$
解释:

awk-F“,”
<--将分隔符设置为

'{OFS=“,”;
<--将输出字段seperator设置为
,因为我们将使用
printf
格式化文本

如果($3!=“Input”){printf“%s”,则$0}
请尝试以下操作

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
$

$cat file.txt
EXP_TRANSF_DE_PARA,N/A,Input,1,1,04/30/2020 19:52:20158828714011131,转换[EXP_TRANSF_DE_PARA]在计算变量列[v_NUFONE]时出错。错误消息为[[TO_INTEGER]:十进制操作溢出
…i:TO_整数(u:RTRIM(u:LTRIM)(u:6711630149',u:���'),u:'���'),i:0),3,不适用,不适用,不适用,-1,-1,不适用
EXP_TRANSF_DE_PARA,N/A,Input,1,2,1,04/30/2020 19:52:20158828714011131,转换[EXP_TRANSF_DE_PARA]在计算变量列[v_NUFONE]时出错。错误消息为[[TO_INTEGER]:十进制操作溢出