已经坚持了一段时间,设法完全删除了两列,但现在我需要在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。我试过删除它们但是我似乎无法在不删除标题的情况下这样做。
感谢任何可以帮助我的人
答案 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
。
补充:样本结果:
[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