从csv中删除两列而不删除列标题

时间:2014-09-23 10:50:19

标签: linux

已经坚持了一段时间,设法完全删除了两列,但现在我需要在1列标题中删除两列(总共3列)。我从我的csv文件中附上了一个snippit。

timestamp;CPU;%usr;%nice;%sys;%iowait;%steal;%irq;%soft;%guest;%idle
2014-09-17 10-20-39 UTC;-1;6.53;0.00;4.02;0.00;0.00;0.00;0.00;0.00;89.45
2014-09-17 10-20-41 UTC;-1;0.50;0.00;1.51;0.00;0.00;0.00;0.00;0.00;97.99
2014-09-17 10-20-43 UTC;-1;1.98;0.00;1.98;5.45;0.00;0.50;0.00;0.00;90.10
2014-09-17 10-20-45 UTC;-1;0.50;0.00;1.51;0.00;0.00;0.00;0.00;0.00;97.99
2014-09-17 10-20-47 UTC;-1;0.50;0.00;1.50;0.00;0.00;0.00;0.00;0.00;98.00
2014-09-17 10-20-49 UTC;-1;0.50;0.00;1.01;3.02;0.00;0.00;0.00;0.00;95.48

我想要做的是删除yyyy-mm-dd以及UTC,只留下时间戳列标题下方的10-20-39。我试过删除它们但是我似乎无法在不删除标题的情况下这样做。

感谢任何可以帮助我的人

2 个答案:

答案 0 :(得分:2)

perl方式:

perl -pe 's/^.+? (.+?) .+?;/$1;/ if $.>1' file 

解释

-pe表示"在将脚本应用到"后打印每一行。脚本本身只是替换标识3个第一个非空白单词,并用三个中的第二个替换它们($1,因为模式被捕获)。仅当当前行号($.)大于1时才会运行。

一种awk方式

awk -F';' '(NR>1){sub(/[^ ]* /,"",$1); sub(/ [^ ]*$/,"",$1)}1;' OFS=";" file 

在这里,我们将输入字段分隔符设置为;,并使用sub()删除第1个字段中的第1个和最后一个字。

答案 1 :(得分:1)

以下sed命令适合您:

sed '1!s/^[^ ]\+ //;1!s/ UTC//'

说明:

  • 1!请勿申请第一行。
  • s/^[^ ]\+ //在第一行("2014-09-17 "处)删除第一组非空格字符。
  • s/ UTC//删除字符串" UTC"

假设csv文件存储为a.csv,则

sed '1!s/^[^ ]\+ //;1!s/ UTC//' < a.csv

将结果打印到标准输出,

sed '1!s/^[^ ]\+ //;1!s/ UTC//' < a.csv > b.csv

将结果保存到b.csv

EDITED:

补充:样本结果:

[pengyu@GLaDOS tmp]$ sed '1!s/^[^ ]\+ //;1!s/ UTC//' < a.csv
timestamp;CPU;%usr;%nice;%sys;%iowait;%steal;%irq;%soft;%guest;%idle
10-20-39;-1;6.53;0.00;4.02;0.00;0.00;0.00;0.00;0.00;89.45
10-20-41;-1;0.50;0.00;1.51;0.00;0.00;0.00;0.00;0.00;97.99
10-20-43;-1;1.98;0.00;1.98;5.45;0.00;0.50;0.00;0.00;90.10
10-20-45;-1;0.50;0.00;1.51;0.00;0.00;0.00;0.00;0.00;97.99
10-20-47;-1;0.50;0.00;1.50;0.00;0.00;0.00;0.00;0.00;98.00
10-20-49;-1;0.50;0.00;1.01;3.02;0.00;0.00;0.00;0.00;95.48