我的文件约有 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
答案1
由于cut
默认情况下打印非分隔行,因此以下工作
cut -f2 -d, file
答案2
awk -F, 'NF > 1 { $1 = $2 } { print $1 }' file
这用于awk
将文件解析为由逗号分隔字段组成的行。
该代码会检测一行中何时存在多个字段,如果存在,则第一个字段将替换为第二个字段。然后打印第一个字段,无论是未修改的还是被条件代码修改的。
答案3
awk -F, 'NF == 1 {print $1}
NF > 1 { print $2}' filename
如果没有逗号,这将仅打印第一个字符串;如果有一个或多个逗号,则将打印第二个字符串。
答案4
您可以按Perl
如下方式执行此操作。
命令行:
$ perl -F, -pale '$_ = $F[1] // $_' out.txt
解释:
-p
将逐行读取记录并自动打印,然后再读取下一个或 eof。-l
使IRS = ORS = "\n"
-F,
形成FS
一个逗号。-a
在字段分隔符(在我们的例子中是逗号)上分割每个记录$_
,然后继续将生成的字段存储在数组中@F
,该数组是零索引的。-e
意味着,它后面的是Perl
代码,它将应用于每个记录。$_ = $F[1] // $_
表达式如下:如果$F[1]
未定义第二个字段,则使用当前记录$_
。然后将该表达式的结果赋给当前记录$_
。- 由于使用中
-p
的切换,在读入新记录之前,会将当前记录取到。perl
stdout
结果:
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
您也可以使用 GNU 版本的sed
编辑器来完成此操作,如下所示:
$ sed -ne '
s/,/\n/
s/.*\n//
s/,/\n/
P
' out.txt