Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.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
Macos 向CSV列添加分隔符_Macos_Csv_Awk - Fatal编程技术网

Macos 向CSV列添加分隔符

Macos 向CSV列添加分隔符,macos,csv,awk,Macos,Csv,Awk,我需要帮助写一个脚本,将添加:,两个字符之间的一列csv文件。根据我的研究,awk看起来像是我需要的工具,但我一直在尝试合并两个解决方案,我正在寻求帮助 我的csv列包含没有分隔符的MAC地址 000000000000 111111111111 222222222222 我还发现了一个示例,该示例将从第1列中读取: awk -F "\"*,\"*" '{print $1}' myfile.csv 但是,我需要帮助读取列中的每一行,应用脚本添加:,然后将文件写入第2列或一个全新的文件。这对我来说

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

我的csv列包含没有分隔符的MAC地址

000000000000 111111111111 222222222222 我还发现了一个示例,该示例将从第1列中读取:

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

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

您可以尝试一下

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
POSIX Awk:

{
  for (x = 1; x < length; x += 2) {
    printf "%s%s", substr($0, x, 2), x == length - 1 ? RS : ":"
  }
}
{
对于(x=1;x
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
逗号分隔符 输入:

000000000000
111111111111
222222222222
输出:

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

sed的另一种方式是:

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


@我认为凯文是对的。解决方案可以是
awk'{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”);如果您正在使用gawk,则打印}输入文件
,因为
gensub有编号匹配的替换,而
gsub没有。看@Simon你是对的,谢谢你纠正我!凯文,你的答案几乎可以,除了
gensub
没有替换到位,所以你需要
print
gensub
的返回值。我正在使用MAC OSX,但无法使其工作,我一直收到一个错误,我尝试了:k;s/([0-9][0-9])([0-9][0-9])/\1:\2/;tk'input.csv>output.csv这似乎是复制的,没有任何更改。请记住,毕竟有一个字段。没有一个空格在中间。恩多-我给了这一个镜头,它似乎是粘贴文件没有改变。这是我的命令-sed's/([0-9][0-9])\B/\1:/g'in.csv>out.csvHi我尝试过这个命令,但似乎它在我的文件中将第四个“B”替换为:。@svt1998gt(等)在mac-sed上不起作用的原因是它无法识别
作为命令分隔符。您需要有一个文字换行符或两个
-e
语句。我尝试使用perl,输出在最后一个0的末尾放了一个:下面是一个输出示例-00:00:00:00:1:11:11:11:1:看起来您的值在行的末尾有空格。请给出您正在处理的正确输入。你的档案看起来怎么样?很抱歉Vijay,最初的问题已经更新了。没有空格,只有换行符。我测试了相同的输入,正如你在我的答案中看到的,它对我有效。您得到的输出是什么?我可以再次编辑csv文件,perl语句在每一行的末尾都会给出一个:。另外一点:尽管到目前为止发布的解决方案适用于测试用例,但实际的MAC地址是十六进制的,因此示例显示的
[0-9]
(在sed、awk或perl中)都需要
[0-9a-fA-F]
000000000000
111111111111
222222222222
00:00:00:00:00:00
11:11:11:11:11:11
22:22:22:22:22:22
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