Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在AIX中删除管道分隔文件中特定列中的空格_Unix_Awk_Sed_Aix - Fatal编程技术网

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

Unix 在AIX中删除管道分隔文件中特定列中的空格,unix,awk,sed,aix,Unix,Awk,Sed,Aix,早上好。长期读者,第一次发邮件,所以请温柔一点 我正在使用AIX5.3,有一个42列的管道分隔文件。第15列和第16列(land | mobile)中的电话号码可能包含空格,也可能不包含空格,具体取决于谁输入了数据 我只需要从第15列和第16列中删除这些空间 Column 15 | Column 16 **Currently** 01942 665432|07865346122 01942756423 |07855 333567 Column 15 | Column 16 **N

早上好。长期读者,第一次发邮件,所以请温柔一点

我正在使用AIX5.3,有一个42列的管道分隔文件。第15列和第16列(land | mobile)中的电话号码可能包含空格,也可能不包含空格,具体取决于谁输入了数据

我只需要从第15列和第16列中删除这些空间

Column 15   |   Column 16 **Currently**
01942 665432|07865346122
01942756423 |07855 333567
Column 15   |   Column 16 **Needs to be**
01942665432|07865346122
01942756423|07855333567
我有一个quick&dirty脚本,不幸的是,它被证明不是很快,因为它是一个while循环,读取每一行,在管道分隔符上剪切字段,将其分配给变量,在第15列和第16列上使用sed仅去除空格,然后将其写入一个新文件

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,但我愿意接受任何人可以提供的建议,因为目前的脚本处理176000条记录需要半个多小时


提前谢谢。

是的,
awk
更适合这里

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

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


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

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

是的,
awk
更适合这里

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

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


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

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

OP可能会也可能不会在标题记录中留出空间。你可能想用你的完美答案来回答这个问题?Sundeep,你救了我的命!!!!这项工作非常完美,将运行时间缩短到惊人的4.8秒!!!我对你感激不尽。@Darren_B不客气。。。请参阅@pedz,它只是
{print$0}
{print}
的快捷方式。。。例如:当您筛选
awk'NR==2'
时,它是
awk'NR==2{print$0}'
的快捷方式
NR==2
is条件。
1
始终为真条件,可以使用条件中计算为真的任何值context@Sundeep啊。我知道'NR==2'。。。我经常这样做。当然:1永远是正确的。很酷!OP可能会也可能不会在标题记录中留出空间。你可能想用你的完美答案来回答这个问题?Sundeep,你救了我的命!!!!这项工作非常完美,将运行时间缩短到惊人的4.8秒!!!我对你感激不尽。@Darren_B不客气。。。请参阅@pedz,它只是
{print$0}
{print}
的快捷方式。。。例如:当您筛选
awk'NR==2'
时,它是
awk'NR==2{print$0}'
的快捷方式
NR==2
is条件。
1
始终为真条件,可以使用条件中计算为真的任何值context@Sundeep啊。我知道'NR==2'。。。我经常这样做。当然:1永远是正确的。很酷!