在Bash中复制CSV列

Pre*_*tor 4 csv bash awk

我有一个问题,客户需要在CSV文件中复制一列。这些值将始终相同,很遗憾,我们的API不允许在JSON中指定重复的列。

例如,我具有以下列结构和值:

Name, Surname, City, Age, Job
John, Doe, Johannesburg, 28, Technical Support
Run Code Online (Sandbox Code Playgroud)

现在我需要复制City,所以输出应为:

Name, Surname, City, City Again, Age, Job
John, Doe, Johannesburg, Johannesburg, 28, Technical Support
Run Code Online (Sandbox Code Playgroud)

该列需要放置在将要重复的列之后。该值还取决于此第一列。

anu*_*ava 5

awk 可以轻松处理:

awk 'BEGIN{FS=OFS=", "} {$3 = $3 OFS $3} 1' file.csv

Name, Surname, City, City, Age, Job
John, Doe, Johannesburg, Johannesburg, 28, Technical Support
Run Code Online (Sandbox Code Playgroud)

注意,这比单行和短命令执行的操作简单易懂,并且比流水线命令效率更高,流水线命令先调用cut两次然后粘贴。

正如@codeforester在下面正确注释的那样,cut不要在输出中重复一列;它用于剥离值。

  • 非常优雅和高效。@anubhava-您的答案中可能会指出`cut`不允许列在其输出中重复的点。在`man cut`中:**如果多次指定一个字段或列,则它在输出中只会出现一次。** (2认同)

Rob*_*obC 2

假设City始终位于第 3 列,则可以使用剪切粘贴命令。例如:

csv=path/to/somefile.csv
echo "$(paste -d',' <(cut -d',' -f1-3 $csv) <(cut -d',' -f3- $csv))" > "$csv"
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. path/to/quux.csv分配给变量的部分应csv替换为.csv文件的实际路径。
  2. 包括重复列的新内容City将写回同一源文件。
  3. <(...)部分称为过程替代,通常在无法获取管道数据时使用。可以在这里找到一个很好的解释。

  • 对于大文件来说,这是非常低效的,因为整个文件必须被读取*三次*次或稍微多一点![`awk`](/sf/answers/3092794211/) 解决方案要好得多,因为它只读取文件一次。 (2认同)