awk 拆分更多列并打印第一个单词

awk split more columns and print first word

我有逗号分隔的文件,我想使用相同的拆分条件 split($column,a,"-") 将第 15 列拆分为 $NF(第 15 列到最后一列)并打印每个拆分的列 a[1]。我无法从第 n 列循环到最后一列并为每一列打印。

awk -F',' -v OFS="\t" '{for(i;<i<$NF,i+1);split($i,a,"_"); print ???}' file.csv

第 15 列打印的文件示例:

NBPF1-chr1-16579269-16579502-MedEx,NBPF1-chr1-16580779-16580863-MedEx,NBPF1-chr1-16581333-16581592-MedEx,NBPF1-chr1-16582457-16582758-MedEx,NBPF1-chr1-16583499-16583796-MedEx

我的期望:

NBPF1,NBPF1,NBPF1,NBPF1,NBPF1,NBPF1

谢谢。

您可以使用这个 awk:

awk 'BEGIN {FS=OFS=","} {for(i=1; i<=NF; ++i) {
split($i, a, /-/); printf "%s%s", a[1], (i<NF ? OFS : ORS)}}' file

NBPF1,NBPF1,NBPF1,NBPF1,NBPF1

i=1 更改为 i=15 或您想要开始从中提取 - 分隔值的任何字段位置。

使用您显示的示例,请尝试以下 awk 代码。在以下 awk 代码中更改 i=15 或您要开始循环的任何字段,直到当前行的最后一个字段。

awk '
BEGIN{
  FS=OFS=","
}
{
  value=""
  for(i=1;i<=NF;i++){
    split($i, a, /-/)
    value=(value?value OFS:"")a[1]
  }
  print value
}
'  Input_file

直接替换怎么样?
如果您只想要拆分后的第一部分,则无需拆分并保存到临时变量:

awk -F, -v OFS="\t" '{for(i=15;i<=NF;i++)printf "%s" OFS, gensub(/-.*/,"",1,$i);print ""}' file.csv

如果会在最右边创建一个空列,如果你不想那样,那么使用这个:

awk -F, -v OFS="\t" '{for(i=15;i<NF;i++)printf "%s" OFS, gensub(/-.*/,"","g",$i);print gensub(/-.*/,"","g",$NF)}' file.csv

如果您希望输出以逗号分隔,请将 "\t" 替换为 ,
它适用于 GNU awk,需要 gensub 实现。

另一个例子,纯粹使用正则表达式替换:

awk '{gsub(/^([^,]*,){14}/,"")}gsub(/-[^,]*(,|$)/,"\t")' file.csv

这个刚刚从 $0 中删除了前 14 列,然后在剩余的每一列中删除了 - 及其后的内容。
使用 gnu awk 测试。

示例输入:

1,2,3,4,5,6,7,8,9,10,11,12,13,14,NBPF1-chr1-16579269-16579502-MedEx,NBPF1-chr1-16580779-16580863-MedEx,NBPF1-chr1-16581333-16581592-MedEx,NBPF1-chr1-16582457-16582758-MedEx,NBPF1-chr1-16583499-16583796-MedEx
1,2,3,4,5,6,7,8,9,10,11,12,13,14,NBPF1-chr1-16579269-16579502-MedEx,NBPF1-chr1-16580779-16580863-MedEx,NBPF1-chr1-16581333-16581592-MedEx,NBPF1-chr1-16582457-16582758-MedEx,NBPF1-chr1-16583499-16583796-MedEx
1,2,3,4,5,6,7,8,9,10,11,12,13,14,NBPF0-chr1-16579269-16579502-MedEx,NBPF1-chr1-16580779-16580863-MedEx,NBPF1-chr1-16581333-16581592-MedEx,NBPF1-chr1-16582457-16582758-MedEx,NBPF9-chr1-16583499-16583796-MedEx

输出:

NBPF1   NBPF1   NBPF1   NBPF1   NBPF1
NBPF1   NBPF1   NBPF1   NBPF1   NBPF1
NBPF0   NBPF1   NBPF1   NBPF1   NBPF9
cut -d, -f15- file | sed 's/-[^,]*//g'
$ awk '{gsub(/-[^,]*/,"")}1' file
NBPF1,NBPF1,NBPF1,NBPF1,NBPF1

$ sed 's/-[^,]*//g' file
NBPF1,NBPF1,NBPF1,NBPF1,NBPF1

如果这不是您真正需要的全部,那么请编辑您的问题以提供更具代表性的样本 input/output。

awk可以得到:

awk -v RS='[-,]' 'NR%5==1' file       
NBPF1                                   
NBPF1
NBPF1
NBPF1
NBPF1

或者完全符合您的期望:

awk -v RS='[-,]' 'NR%5==1{printf "%s%s", sep, [=11=]; sep=","} END{print ""}' file
NBPF1,NBPF1,NBPF1,NBPF1,NBPF1