我需要更改文件中的单行。它始终位于文件的第一行。
看起来像:
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
答案 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