从 csv 文件中删除特定列,在输出中保持相同的结构

Delete specific columns from csv file maintaining same structure on output

我想删除第 3 列并在输出文件中保持相同的结构。

输入文件

12,10,10,10 10,1
12,23 1,45,6,7
11  2,33,45,1,2
1,2,34,5,6

我试过了

awk -F, '!(="")' file | awk -v OFS=',' '{=}1'
12,10,10,10,1
12,23,1,6,7
11,2,33,1,2
1,2,5,6

期望的输出

12,10,10 10,1
12,23 1,6,7
11  2,33,1,2
1,2,5,6

感谢您的帮助

最好在此处使用 sed

sed -E 's/^(([^,]*,){2})[^,]*,//' file

12,10,10 10,1
12,23 1,6,7
11  2,33,1,2
1,2,5,6

搜索正则表达式:

  • ^: 开始
  • (: 开始第一个捕获组
    • (: 开始第二个捕获组
    • [^,]*,:匹配0个或多个后跟逗号的非逗号字符
    • ){2}: 结束第二个捕获组。 {2}表示匹配上面的2对match
  • ): 结束第一个捕获组
  • [^,]*,:匹配0个或多个后跟逗号的非逗号字符

替换:

  • :向后引用捕获的组#1

sed解法:

sed -E 's/^([^,]+,[^,]+,)[^,]+,//' file
  • ^ - 字符串的开头
  • [^,]+ - 匹配除 ,
  • 之外的任何字符
  • </code> - 指向第一个捕获的带括号的组 <code>(...)

输出:

12,10,10 10,1
12,23 1,6,7
11  2,33,1,2
1,2,5,6

在 awk 中:

$ awk 'BEGIN{FS=OFS=","}{for(i=3;i<NF;i++)$i=$(i+1);NF--}1' file
12,10,10 10,1
12,23 1,6,7
11  2,33,1,2
1,2,5,6

Perl 解决方案:

perl -l -aF/,/ -ne 'splice @F, 2, 1; print join ",", @F'
  • -l 从输入中删除换行符并将它们添加到 prints
  • -n逐行读取输入
  • -a 将每一行分割成@F 数组
  • -F指定分割方式(/,/表示逗号)
  • splice 从数组中删除元素,在本例中它删除位置 2 的 1 个元素。