我正在尝试删除.tab文件中除特定字段的第一个字符之外的所有字符。我想在字段10和11中只保留第一个字符。
通常字段中包含35个字符,因此我使用了:
awk '{gsub ("..................................$","",$10;print} file
但是,有些字段少于35,并被此替换函数忽略。我厌倦了使用子字符串,但我无法弄清楚如何使字段特定。我相信有一种方法可以在awk中使用perl,这样我就可以使用函数
了perl -pe 's/(.).*/$1/g'
但我不知道该怎么做并使用该字段作为输入值,因此除了更改的字段外,文件都是相同的。
有没有办法用gsub做perl等效,或用perl做等效的awk?
帮助表示赞赏!
答案 0 :(得分:3)
使用awk
的一种方式:
awk '{ for (i=10;i<=11;i++) { $i = substr( $i, 1, 1) } } { print }' infile
答案 1 :(得分:1)
使用gensub
gawk
函数的另一种方法
gawk '{ for (i=10;i<=11;i++) { $i = gensub(/(.).*/ , "\\1", G , $i) } }1' infile
答案 2 :(得分:1)
最短awk
版本,我可以理解:
awk '($10=substr($10,1,1))&&$11=substr($11,1,1)' infile
如果第10和/或第11个字段不存在,则不打印该行。
perl
perl -ane '$F[9]=~s/(.).*/$1/;$F[10]=~s/(.).*/$1/;print "@F\n"' infile
即使未定义第10和/或第11个字段,也会打印该行。
答案 3 :(得分:1)
perl的另一种方式:
perl -pe '$c=0; s/(\S+)/(++$c < 10 || $c > 11) ? $1 : substr($1,0,1)/eg' filename