提取两个逗号之间的字符?

提取两个逗号之间的字符?

我的文件约有 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的切换,在读入新记录之前,会将当前记录取到。perlstdout

结果:

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

相关内容