Bash 在不更改字段内容的情况下替换文件中的分隔符

Bash 在不更改字段内容的情况下替换文件中的分隔符,bash,awk,Bash,Awk,我必须将一个以空格作为分隔符的文件批量加载到Oracle数据库中。问题是任何字段也包含空格,如下所示 os linux good 1 os mac good 1 os windows bad 3 os unknown not clear 0 我尝试过这个Awk命令,但它也会替换字段中的空格 cslamdi0416:~ user1$ awk '$1=$1' FS=" " OFS="|" myfile os|linux|good|1 os|mac|good|1 os|windows|bad|3 o

我必须将一个以空格作为分隔符的文件批量加载到Oracle数据库中。问题是任何字段也包含空格,如下所示

os linux good 1
os mac good 1
os windows bad 3
os unknown not clear 0
我尝试过这个Awk命令,但它也会替换字段中的空格

cslamdi0416:~ user1$ awk '$1=$1' FS=" " OFS="|" myfile
os|linux|good|1
os|mac|good|1
os|windows|bad|3
os|unknown|not|clear|0
我不想那样。有没有办法产生这种输出

os linux|good|1
os mac|good|1
os windows|bad|3
os unknown|not clear|0
???我相信我需要使用NF变量来指定字段的数量,但我不清楚如何做到这一点。谢谢你的帮助

awk -v OFS="|" ' NF==4 {print $1" " $2, $3, $4} NF!=4 {print "Error in fmt:" $0}' file
应该满足你的需求

输出

os linux|good|1
os mac|good|1
os windows|bad|3
第二块突出显示不包含4个字段的所有记录。如果不需要错误消息,请替换为

NF!=4 {print}
IHTH

awk'{print$1”“$2”““$3”“$4}'FS=”“myfile

输出:

os linux|good|1
os mac|good|1
os windows|bad|3
另一种仅将第一个分隔为
空格
,其余分隔为
|
的方法是:

awk '{for (i=1; i<=NF; i++) if(i==1) {printf "%s ", $i} else if(i==NF) {printf "%s\n", $i} else {printf "%s|", $i}}' myfile

awk'{for(i=1;实际上我的例子是误导性的(我的坏)。任何字段中都可以有空格。不仅仅是第一个空格。你如何知道空格在字段内部还是字段之间?是否始终是第一个空格在字段内部?始终是从末尾算起的第三个空格?还有其他吗?字段内始终只有一个空格还是可以有多个空格?编辑你的问题,以澄清问题,并更好地覆盖你的问题如有必要,请提供示例。更正了措辞并修改了示例。您必须努力告诉我们如何识别列之间的vs中的空格。目前我们没有任何线索。这不仅仅是“不够好”,这是完全不可能的。由于文件中可能出现随机的非字段分隔符空间,因此无法通过编程方式找到它们,并以与文件中其他字段分隔符空间不同的方式处理它们,因为
ab c
可能意味着
a;bc
ab;c
a;b;c
ab c
(使用
突出显示字段分隔)。作为一个人,你能查看3000万条记录中的任何一条,并知道将“|”放在哪里吗分隔符?如果是,你怎么知道?如果不是,awk也不能。同时,根据你的最终目标,你可以做一些事情,但你可能想添加一些标记,让其他人加入其中。习惯于处理大量非结构化数据并提取一些有用信息的人。你是对的。