我想在 Linux 中转换这个文件...
1:a:A:G rs123
1:b:C:T rs456
1:c:G:A,C rs174
对于这个文件...
1:a rs123
1:b rs456
1:c rs174
有人知道该怎么做吗?先感谢您!
答案1
如果所有输入值都一致,则只需打印除这两列之外的所有列:
awk -F'[: ]' '{ print $1":"$2" "$5 }' inputFile
答案2
@terdon 解决方案没有任何问题,但只是为了好玩,gawk
使用解决方案
awk -F':[^a-z]+' '{print $1, $2}' file1
组成IFS
一个上下文regex
,匹配任何连续的字符串开头,:
后跟除小写字母之外的任何内容的可变长度组合[^a-z]+
,这只会留下您想要的两个块。
答案3
几个选择:
$ awk -F'[: ]' '{print $1":"$2,$5}' file
1:a rs123
1:b rs456
1:c rs174
这告诉awk
我们使用空格或 a:
作为字段分隔符,然后打印第一个字段、 a :
、第二个字段和第五个字段。
$ sed -E 's/^([^:]*:[^:]*):.* (.*)$/\1 \2/' file
1:a rs123
1:b rs456
1:c rs174
此处,捕获从行 ( ) 开头到第一个 的sed
所有非-:
( )以及下一段非字符直到第二个。然后,我们匹配所有内容,直到该行的最后一个空格,并捕获其后的所有字符。最后,整行被捕获的两个模式替换 ( )。[^:]*
^
:
:
:
\1 \2
$ perl -pe 's/(.+?:.+?):.*\s(\S+)$/$1 $2/' file
1:a rs123
1:b rs456
1:c rs174
这与上面的 sed 方法具有相同的基本思想,但使用非贪婪的正则表达式模式并在该行的最后一个空白字符之后搜索非空白字符。
答案4
除了所有 GNU coreutil 解决方案之外,如果您打开它vim
并输入,它也可以工作
:%norm 0f:f:vf hd
其次是Enter
。
它能做什么:
:
让你进入命令模式
%
修饰符已norm
在文件中的所有行上运行
norm
一个可以在多行上运行的命令,就像您在正常模式下键入它后面的内容一样。
0
到达该行的开头
f:
转到文本中下一个出现的冒号符号(即字段分隔符)。执行此操作两次以到达第三列的开头
v
进入可视模式(因为这使得选择要删除的内容变得更加容易:-))
f˽
(注意空格!!)转到下一个出现的空格(即另一个字段分隔符),
h
向左移动一个字符(这样当我们删除选择后我们就不会删除空格),最后
d
删除所选内容