2

我需要帮助编写一个脚本,该脚本将:在单个列 csv 文件中的两个字符之间添加。根据我的研究,awk 看起来像是我需要的工具,但我一直在尝试合并两个解决方案,我正在寻求帮助。

我的 csv 列涉及没有分隔符的 MAC 地址

000000000000
111111111111
222222222222

我需要将输出转换为

00:00:00:00:00:00
11:11:11:11:11:11
22:22:22:22:22:22

我想转换的 csv 文件中有大约 1500 个。

我找到了一个:为每两个字符添加的解决方案:

add=000000000000
echo $add | awk '{for(i=1;i<=length($0);i+=2){printf("%s:",substr($0,i,2))}}'|awk '{sub(/:$/,"")};1' 
00:00:00:00:00:00

我还找到了一个将从第 1 列读取的示例:

awk -F "\"*,\"*" '{print $1}' myfile.csv

但是,我需要帮助阅读列中的每一行,应用脚本添加:然后将文件写入第 2 列或一个全新的文件,这对我来说并不重要。

4

5 回答 5

3

POSIX awk:

{
  for (x = 1; x < length; x += 2) {
    printf "%s%s", substr($0, x, 2), x == length - 1 ? RS : ":"
  }
}
于 2013-06-13T05:41:20.553 回答
3

GNU sed

sed  -e 's/\([0-9][0-9]\)/\1:/g' -e 's/:$//' file

输入:

000000000000
111111111111
222222222222

输出:

00:00:00:00:00:00
11:11:11:11:11:11
22:22:22:22:22:22
于 2013-06-13T06:37:07.877 回答
1

你可以试试

awk '{print gensub("([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9‌​])","\\1:\\2:\\3:\\4:\\5","g")}' INPUTFILE
于 2013-06-13T05:11:49.950 回答
0

另一种方式sed

sed 's/../:&/2g' file

$ cat file
000000000000
111111111111
222222222222
$ sed 's/../:&/2g' file
00:00:00:00:00:00
11:11:11:11:11:11
22:22:22:22:22:22
于 2013-07-03T21:00:41.727 回答
0

Perl 也将执行并更改 awk 不执行的文件:

perl -pi -e 's/(..)/$1:/g;s/:$//g' your_file

测试:

> cat temp
000000000000
111111111111
222222222222
> perl -pe 's/(..)/$1:/g;s/:$//g' temp
00:00:00:00:00:00
11:11:11:11:11:11
22:22:22:22:22:22
>

如果你坚持 awk :

awk '{gsub("..","&:");print substr($0,0,length($0)-1)}' your_file
于 2013-06-13T06:24:03.430 回答