Linux命令行 - 在文本文件中某行的每个选项卡之前删除2个字符

时间:2014-05-19 22:56:18

标签: perl command-line sed grep cut

我有一个制表符分隔的文本文件。第二行是一行列标题。我想重现该文件,但删除每个列标题中的最后两个字符,第一个除外。我要删除的第一个字符始终是句点,第二个字符始终是数字,但可以是不同的数字(请参阅下面的示例)。我需要在Linux命令行中完成此操作以简化我的分析。也许使用sed,perl,grep,cut或其他命令的某种组合?

例如,

我有:

Constructed data file 
Data    s123.4  s567.8  s901.2 
abcd    123456  789012  345678 
efgh    901234  567890  123456 
ijkl    789012  345678  901234

我想要:

Constructed data file
Data    s123    s567    s901
abcd    123456  789012  345678
efgh    901234  567890  123456
ijkl    789012  345678  901234   

我知道这可以通过以下方式在MS Excel中完成:
1.在第2行和第2行之间输入一个新行。 3
2.将列名从A2复制到A3
3.在B3中输入= LEFT(B2,LEN(B2)-2)
4.在整行上涂抹配方
5.复制行&粘贴为值
6.删除原始第2行

但是当然在Linux命令行中它会快得多!

2 个答案:

答案 0 :(得分:0)

使用perl one-liner

perl -i -pe 's/\.\d\b//g if $. == 2' file.txt

说明:

切换

  • -i:编辑<>个文件(如果提供了扩展程序,则进行备份)
  • -p:为输入文件中的每个“行”创建一个while(<>){...; print}循环。
  • -e:告诉perl在命令行上执行代码。

<强>代码

  • $. == 2:检查当前行是否为第2行。
  • s/\.\d\b//g:删除文字末尾的所有.NUM

答案 1 :(得分:0)

通过GNU sed,

sed -r 's/([0-9]+)\.([0-9]+)/\1/g' file

仅限第二行试试,

sed -r '2s/([0-9]+)\.([0-9]+)/\1/g' file