删除 AIX 中管道分隔文件中特定列中的空格

Removing blank spaces in specific column in pipe delimited file in AIX

早上好。好久 reader,第一次发邮件,所以请多多关照。

我正在使用 AIX 5.3,并且有一个 42 列竖线分隔文件。第 15 和 16 列(陆地|移动)中有电话号码,可能包含也可能不包含 space,具体取决于输入数据的人。

我只需要从第 15 列和第 16 列中删除这些 space 即

Column 15   |   Column 16 **Currently**
01942 665432|07865346122
01942756423 |07855 333567
Column 15   |   Column 16 **Needs to be**
01942665432|07865346122
01942756423|07855333567

我有一个快速而肮脏的脚本,不幸的是,它被证明一点也不快,因为它是一个 while 循环读取每一行,切割管道分隔符上的字段,将其分配给一个变量,在第 15 列上使用 sed & 16 仅去除空白 spaces 然后将其写入新文件即

cat $file | while read 

output

do

.....

fourteen=$( echo $output | cut -d'|' -f14 )

fifteen=$( echo $output | cut -d'|' -f15 | sed 's/ //g' )

echo ".....$fourteen|$fifteen..." > $new_file

done

我知道必须有更好的方法来执行此操作,可能使用 AWK,但我愿意接受任何人可以提供的任何建议,因为脚本目前需要半小时以上来处理 176,000 条记录。

提前致谢。

是的,awk更适合这里

$ cat ip.txt 
a|foo bar|01942 665432|07865346122|123
b|i j k |01942756423 |07855 333567|90870

$ awk 'BEGIN{FS=OFS="|"} {gsub(" ","",); gsub(" ","",)} 1' ip.txt 
a|foo bar|01942665432|07865346122|123
b|i j k |01942756423|07855333567|90870
  • BEGIN{FS=OFS="|"} 设置 | 作为输入和输出字段分隔符
  • gsub(" ","",) 仅将第 3 列的所有空格替换为空
  • gsub(" ","",) 仅将第 4 列的所有空格替换为空
  • 1 打印输入记录的惯用方式(包括所做的任何修改)

34 更改为您需要的任何字段


如果第一行不受影响,添加一个条件

awk 'BEGIN{FS=OFS="|"} NR>1{gsub(" ","",); gsub(" ","",)} 1' ip.txt