dan*_*e_t 5 awk text-processing
我有多个 csv 文件,内容格式如下:
"TIMESTAMP",col2,col3,col4
"yyyy-mm-dd HH:mm",20,19,17
Run Code Online (Sandbox Code Playgroud)
我想替换-为,/以便最终我有:
TIMESTAMP,col2,col3,col4
yyyy/mm/dd HH:mm,20,19,17
Run Code Online (Sandbox Code Playgroud)
我使用以下命令附加文件,但没有任何反应:
find -name '*.csv' -exec awk '{gsub(/-/, "/",$1)}' '{}' \;
Run Code Online (Sandbox Code Playgroud)
我缺少什么?请帮忙
您的awk命令实际上确实进行了您想要的更改(除了它在第一个空格分隔字段而不是逗号分隔字段中进行更改),但它不会打印它,因为您没有告诉它打印:
$ cat file.csv
TIMESTAMP,col2,col3,col-4
yyyy-mm-dd HH:mm,20,19,17
$ awk '{gsub(/-/, "/",$1)}' file.csv
$
Run Code Online (Sandbox Code Playgroud)
正如您在上面看到的,您的命令没有输出。与之比较:
$ awk -F, -v OFS=, '{gsub(/-/, "/", $1); print}' file.csv
TIMESTAMP,col2,col3,col-4
yyyy/mm/dd HH:mm,20,19,17
Run Code Online (Sandbox Code Playgroud)
但是,这不太可能是您想要的,因为这只会将所有文件的内容打印到标准输出。如果您想修改实际文件,请尝试以下操作:
$ perl -i -F, -lane '$F[0] =~ s|-|/|g; print join ",",@F' file.csv
$ cat file.csv
TIMESTAMP,col2,col3,col4
yyyy/mm/dd HH:mm,20,19,17
Run Code Online (Sandbox Code Playgroud)
我建议您使用-i.bak它将创建带有扩展名的原始文件的副本.bak,以防万一。然后,您可以将其合并到您的命令中,如下所示:
find . -name '*.csv' -type f -exec perl -i.bak -F, -lane '
$F[0] =~ y|-|/|; print join ",", @F' '{}' +
Run Code Online (Sandbox Code Playgroud)
或者,如果您有 GNU awk ( gawk) 并且可以保证当前工作目录不包含名为infile或 的文件infile.awk,您可以这样做:
find . -name '*.csv' -type f -exec gawk -F, -v OFS=, -i inplace '
{gsub(/-/, "/",$1); print}' '{}' +
Run Code Online (Sandbox Code Playgroud)