在字符串中保留第一个字符,在特定的单个字段中

时间:2013-05-22 19:06:17

标签: perl awk field

我正在尝试删除.tab文件中除特定字段的第一个字符之外的所有字符。我想在字段10和11中只保留第一个字符。

通常字段中包含35个字符,因此我使用了:

awk '{gsub ("..................................$","",$10;print} file

但是,有些字段少于35,并被此替换函数忽略。我厌倦了使用子字符串,但我无法弄清楚如何使字段特定。我相信有一种方法可以在awk中使用perl,这样我就可以使用函数

perl -pe 's/(.).*/$1/g'  

但我不知道该怎么做并使用该字段作为输入值,因此除了更改的字段外,文件都是相同的。

有没有办法用gsub做perl等效,或用perl做等效的awk?

帮助表示赞赏!

4 个答案:

答案 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