使用bash

时间:2015-07-06 08:12:28

标签: python bash shell awk

我需要更改文件中的单行。它始终位于文件的第一行。

看起来像:

h\tn0   n1  n2  n3  n4  n5  n6  n7  n8  n9  hilu    cjt 1   1000000

除了h之外,所有间隙都有一个标签。

我需要将该行重新转换为

h  n1   n2  n3  n4  n5  n6  n7  n8  n9  
hilu    cjt 1   1000000

在开头的那条线\ t和n0需要去的地方,需要在h和n1之间有一个标签。然后换行需要在 hilu 之前开始,但是在n9之后应该没有其他标签

理想情况下,我只是将文件提供给脚本,并且不需要编写中间脚本来填充。

可能是Perl或python中的高效版本吗?我想到了R但是文件中有1000行,只有第一个留置权需要改变......

尝试使用jahid中的解决方案从

运行r
> system(paste("sed -r \'1s/(.*)\t(REGION.*)/\1\n\2/;1s/\\t[^[:space:]]+//\'","arg_t1")) 
sed: -e expression #1, char 20: unterminated `s' command

从我得到的通知建议

> system(paste("sed -r \"1s/(.*)\t(REGION.*)/\1\n\2/;1s/\\t[^[:space:]]+//\"","arg_t1")) 
sed: -e expression #1, char 20: unterminated `s' command

3 个答案:

答案 0 :(得分:1)

这不是一个bash工作,它是ed或sed的工作。例如,sed -i -e '1s/\\tn0\s*/\t/' -e '1s/\s*\(hilu\)/\n\1/' filename可以执行此操作。由于Perl的基础是shell,awk和sed的合并,它也可以类似地使用。

编辑本身效率不高,因为POSIX文件语义不允许插入或删除数据,仅允许(覆盖)写入或截断。因此,此命令复制文件,仅更改开头。如果作为管道的一部分完成(只需删除-i输出到stdout),它实际上是零成本。此外,根据今天的标准,数千行数据仍然很小。

答案 1 :(得分:1)

使用sed(使用扩展正则表达式):

sed -r '1s/(.*)\t(hilu.*)/\1\n\2/;1s/\\t[^[:space:]]+//' file

要更改文件:

sed -r --in-place '1s/(.*)\t(hilu.*)/\1\n\2/;1s/\\t[^[:space:]]+//' file

答案 2 :(得分:0)

对于您的示例,使用 Python 可能是这样的。但是你也需要打开文件并获取变量行内的第一行。

import re

line = 'h\tn0   n1  n2  n3  n4  n5  n6  n7  n8  n9  hilu    cjt 1   1000000'
line = re.sub('n9\s*','n9\n', re.sub('h.+n1', 'h\tn1', line))
print line