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

时间:2017-12-14 12:13:04

标签: linux bash awk gawk

我想删除第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, '!($3="")' file | awk -v OFS=',' '{$1=$1}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

感谢您的帮助

4 个答案:

答案 0 :(得分:2)

最好在这里使用FormData

handleSubmit(event) {
    event.preventDefault();
    const data = new FormData(event.target);
    // Assuming you are using fetch
    fetch('url', {
      method: 'POST',
      body: data,
    });
}

搜索正则表达式:

  • sed:开始
  • sed -E 's/^(([^,]*,){2})[^,]*,/\1/' file 12,10,10 10,1 12,23 1,6,7 11 2,33,1,2 1,2,5,6 :启动第一个捕获组
    • ^:启动第二个捕获组
    • (:匹配0个或更多非逗号字符后跟逗号
    • (:结束第二个捕获组。 [^,]*,表示匹配2对以上匹配
  • ){2}:结束第一个捕获组
  • {2}:匹配0个或更多非逗号字符后跟逗号

<强>替换

  • ):对已捕获的组#1的反向引用

答案 1 :(得分:2)

sed 解决方案:

sed -E 's/^([^,]+,[^,]+,)[^,]+,/\1/' file
  • ^ - 字符串的开头
  • [^,]+ - 匹配除,
  • 之外的所有字符
  • \1 - 指向第一个已捕获的括号内组(...)

输出:

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

答案 2 :(得分:2)

在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

答案 3 :(得分:2)

Perl解决方案:

perl -l -aF/,/ -ne 'splice @F, 2, 1; print join ",", @F'
  • -l从输入中删除换行符并将其添加到print s
  • -n逐行读取输入行
  • -a将每一行拆分为@F数组
  • -F指定如何拆分(/,/表示逗号)
  • splice从数组中删除元素,在这种情况下,它会删除位置2处的1个元素。