使用bash过滤某些列的数值

时间:2014-03-19 09:43:46

标签: bash shell sed awk

我的文件看起来像这样

1;1;Happy Feet;WB;€546,353;-32.3%;;121;-;€4,515;€2,841,113;5;Australia, USA;:
2;3;The Departed;WB;€435,830;-34.8%;;85;-;€5,127;€1,149,495;2;Unknown;:
3;2;Eragon;Fox;€412,229;-41.6%;;90;-;€4,580;€1,752,715;3;UK, USA;:
....

这些文件通过使用tail来剪切前6行来进入:

sudo tail -n+7 filename

是否可以仅保留第5,10和11列的数值并用整数值替换这些列?我在考虑awk和sed,但我对这些工具没有任何经验..

目标是在一个命令中完成所有操作,并编写一个如下所示的文件:

1;1;Happy Feet;WB;546353;-32.3%;;121;-;4515;2841113;5;Australia, USA;:
2;3;The Departed;WB;435830;-34.8%;;85;-;5127;1149495;2;Unknown;:
3;2;Eragon;Fox;412229;-41.6%;;90;-;4580;1752715;3;UK, USA;:

2 个答案:

答案 0 :(得分:2)

您可以使用awk

awk -F';' '{gsub("[^0-9.]", "", $5);gsub("[^0-9.]", "", $10);gsub("[^0-9.]", "", $11)}1' OFS=';' inputfile

为了您的输入,它会产生:

1;1;Happy Feet;WB;546353;-32.3%;;121;-;4515;2841113;5;Australia, USA;:
2;3;The Departed;WB;435830;-34.8%;;85;-;5127;1149495;2;Unknown;:
3;2;Eragon;Fox;412229;-41.6%;;90;-;4580;1752715;3;UK, USA;:

编辑:使用awk执行相同操作的一种惯用方法是使用数组来保留索引:

awk -F';' 'BEGIN{split("5,10,11",a,",")}{for(i in a){gsub("[^0-9]","",$a[i])}}1' OFS=';' inputfile

答案 1 :(得分:1)

您可以使用awk:

awk -F';' '{gsub(/[^0-9]/, "", $5); gsub(/[^0-9]/, "", $10); 
            gsub(/[^0-9]/, "", $11);} 1' OFS=';' file

1;1;Happy Feet;WB;546353;-32.3%;;121;-;4515;2841113;5;Australia, USA;:
2;3;The Departed;WB;435830;-34.8%;;85;-;5127;1149495;2;Unknown;:
3;2;Eragon;Fox;412229;-41.6%;;90;-;4580;1752715;3;UK, USA;: