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
我有逗号分隔的文件,我想使用相同的拆分条件 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