替换文件中的分隔符而不更改字段内容

时间:2015-04-02 17:18:31

标签: 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
os|unknown|not|clear|0

我不想要那个。有没有办法产生这个输出

os linux|good|1
os mac|good|1
os windows|bad|3
os unknown|not clear|0

??我相信我需要使用NF变量来指定字段数,但我不清楚如何做到这一点。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

awk '{print $1" "$2"|"$3"|"$4}' FS=" " myfile

输出:

os linux|good|1
os mac|good|1
os windows|bad|3

另一种仅将第一个与space分开,其余与|分开的方法是:

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