awk分割多列并打印第一个单词。

3

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

awk -F',' -v OFS="\t" '{for(i;$15<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

谢谢。


1
我认为你已经接近成功了:{for(i=15;i<=$NF;++i){split($i,a,"-"); print a[1]}} - JNevill
1
$NF 是最后一个字段的内容,而 NF 是该行中的字段数,请注意它们之间的区别。 - Til
7个回答

4

使用您展示的样本,请尝试以下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

3
您可以使用此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 或其他你想要开始提取由 - 分隔的值的字段位置。


3
cut -d, -f15- file | sed 's/-[^,]*//g'

3
$ awk '{gsub(/-[^,]*/,"")}1' file
NBPF1,NBPF1,NBPF1,NBPF1,NBPF1

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

如果这并不是你所需要的全部内容,请编辑你的问题提供更真实的样本输入/输出。


1

如果只是想要分割后的第一部分,无需将其拆分并保存到临时变量中,直接替换即可:

如何替换?

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


1
另一个例子,纯粹使用正则表达式进行替换:
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

3
输出结果每行末尾也应该显示制表符,对吗? - user14473238
好的,为了代码简洁性,我在这里没有处理那个问题 :) @rowboat - Til

1
使用awk,你可以得到它:

awk可以实现:

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

或者确切地说,你期望什么:
awk -v RS='[-,]' 'NR%5==1{printf "%s%s", sep, $0; sep=","} END{print ""}' file
NBPF1,NBPF1,NBPF1,NBPF1,NBPF1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接