【问题标题】:I need to cut columns 5 & 6 from a few hundred files我需要从几百个文件中删除第 5 列和第 6 列
【发布时间】:2017-06-27 22:55:48
【问题描述】:

我有多个 CSV 文件。我需要从中删除第 5 列和第 6 列。示例file.csv

column1,column2,column3,mm/dd/yyyy,column5,column6,column7,...,column52

我已经搜索过了,似乎没有什么比它应该的那么简单。我希望有一个sed 解决方案,以便它会更新每个文件。我不会重命名文件,它们将保持不变,除了剪切文件现在将消失。

【问题讨论】:

  • 是否引用了任何字段?像这样:column3, "column4, comma in field", column5。 (这只是 3 个字段,但任何简单的正则表达式解决方案都会分成 4 个并打破带引号的字段。)这些字段在逗号后的列之间是否有空格,如您所示? CSV 出奇的复杂……
  • 逗号之间没有空格。没有引号,但某些字段中有空格。以及日期字段中的斜线和时间戳中的冒号。
  • 那么请修正你的例子。谢谢

标签: file unix awk sed cut


【解决方案1】:

您可以在循环中使用cut,假设您的所有文件至少有 7 列:

for file in *.csv; do
  cut -f1-4,7- -d, "$file" > "$file".reduced
  # move reduced file to original once tested
  # mv "$file".reduced "$file"
done
  • -f1-4,7- => 获取字段 1-4,然后从 7 开始(基本上,删除 5 和 6)

【讨论】:

  • 我已经快速测试了剪切和移动。它似乎工作。在接受您的回答之前,我会进一步测试。谢谢。
  • 为了重命名我打算使用的多个文件:for i in *.csv.reduced do j=echo $i | sed "s/.reduced//"` mv $i $j done `
【解决方案2】:

使用 GNU sed:

 sed 's/,[^,]*//4;s/,[^,]*//4' file

添加-i 标志以就地编辑文件:

sed -i 's/,[^,]*//4;s/,[^,]*//4' file

或更短:

sed 's/\([^,]*,\)\{2\}//3' file

【讨论】:

    【解决方案3】:
    perl -p -i -e '{if(/(.*),(.*),(.*),(.*),.*,.*,(.*)/) {print "$1,$2,$3,$4,$5\n"}}' file.csv
    

    这将在删除第 5 列和第 6 列后直接更新文件。

    【讨论】:

      猜你喜欢
      • 2015-12-13
      • 2017-04-25
      • 2015-12-21
      • 2018-03-21
      • 2019-03-03
      • 2023-02-24
      • 2013-06-05
      • 1970-01-01
      • 2022-11-04
      相关资源
      最近更新 更多