将分隔符添加到CSV列

时间:2013-06-13 05:02:35

标签: macos csv awk

我需要帮助编写一个脚本,在单个列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列或整个新文件,这对我来说无关紧要。

5 个答案:

答案 0 :(得分:3)

POSIX Awk:

{
  for (x = 1; x < length; x += 2) {
    printf "%s%s", substr($0, x, 2), x == length - 1 ? RS : ":"
  }
}

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分: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