我有一个大约 300 万行的文件,这是我文件的前几行:
head out.txt
NA
NA
NA
NA
NA
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753,gene85754
gene85752,gene85753,gene85754
gene85752,gene85753,gene85754
gene85752,gene85753,gene85754
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752
gene85752
对于那些以“,”分隔的行,我想保留第一个逗号之后和第二个逗号之前的所有内容。这是我想要的输出:
outgood.txt
NA
NA
NA
NA
NA
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85752
gene85752
由于
cut
默认情况下打印非定界行,因此以下工作这用于
awk
将文件解析为由逗号分隔的字段组成的行。代码检测一行中何时有多个字段,如果有,则将第一个字段替换为第二个字段。然后打印未修改或由条件代码修改的第一个字段。
如果没有逗号,这将只打印第一个字符串,如果有一个或多个逗号,则打印第二个字符串。
您可以
Perl
按以下方式执行此操作。命令行:
解释:
-p
在进入读取下一个或 eof 之前,将逐行读取记录并自动打印。-l
使IRS = ORS = "\n"
-F,
做FS
一个逗号。-a
在字段分隔符上分割每条记录$_
,在我们的例子中是逗号,然后将生成的字段存储在数组中@F
,该数组是零索引的。-e
暗示,紧随其后的是Perl
代码,将应用于每条记录。$_ = $F[1] // $_
表达式如下:如果$F[1]
未定义第二个字段,则使用当前记录$_
。然后将此表达式的结果分配给当前记录$_
。-p
切换,在读入新记录之前,将当前记录取为.perl
stdout
结果:
您也可以使用 GNU 版本的
sed
编辑器来执行此操作,如下所示: