从 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
从输入中删除换行符并将它们添加到 print
s
-n
逐行读取输入
-a
将每一行分割成@F 数组
-F
指定分割方式(/,/
表示逗号)
- splice 从数组中删除元素,在本例中它删除位置 2 的 1 个元素。
我想删除第 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
从输入中删除换行符并将它们添加到print
s-n
逐行读取输入-a
将每一行分割成@F 数组-F
指定分割方式(/,/
表示逗号)- splice 从数组中删除元素,在本例中它删除位置 2 的 1 个元素。