使用awk进行文件格式化的简单但合乎逻辑的问题

时间:2011-10-30 12:56:23

标签: regex bash shell sed awk

我是这些awk和shell的新手,并且遇到了一个简单但合乎逻辑的问题......

输入文件:

6000 9876 5675 ....
8576 8765 9845 ...
....

输出文件:(必填)

60 00 98 76 56 75 ....
85 76 87 65 98 45 ...
....

将输出转换为输入是一项相当容易的任务

awk '{printf("%s%s %s%s %s%s %s%s", $1, $2, $3, $4, $5, $6, $7, $8)}' output_file
                                                          > input_file

但是将输入转换为输出我没有猜测

(虽然我认为NF的一些逻辑可以解决这个问题,但事先并不知道字段数,但主要问题是即使我不知道。 fileds然后如何进行?

分钟。要阅读的单位将像$1,$2等。我需要打破它们,需要在它们之间插入一个空格。

我对regex了解不多,但我会亲自动手。可能会对sed进行一些操纵,regex可以帮助我。

请提供宝贵的建议。

3 个答案:

答案 0 :(得分:2)

以下是一个sed示例:

$ echo "1234 5678 9012"|sed -e 's/\([0-9][0-9]\)\([0-9][0-9]\)/\1 \2/g'
12 34 56 78 90 12

答案 1 :(得分:1)

tr -d ' ' < inputFile | sed 's/../& /g'

或者避免第一个tr:

sed -e 's/ //g' -e 's/../& /g'

答案 2 :(得分:0)

由于问题标题提到“awk”,我给出了一个awk解决方案,虽然已经接受了答案:

这需要gawk:

kent$  echo "6000 9876 5675
8576 8765 9845"|awk '{for(i=1;i<=NF;i++)$i=gensub(/^([0-9]{2})([0-9]{2})$/,"\\1 \\2","g",$i);print }'                                    
60 00 98 76 56 75
85 76 87 65 98 45