查找并替换多个 csv 文件中的特定字符串

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)

我缺少什么?请帮忙

ter*_*don 2

您的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)