2

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

通常这些字段中有 35 个字符,所以我使用了:

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

但是,有些字段少于 35,并被此替换功能忽略。我厌倦了使用子字符串,但我不知道如何使它成为特定字段。我相信有一种方法可以在 awk 中使用 perl,以便我可以使用该函数

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

但我不知道如何做到这一点并将该字段用作输入值,因此除了更改的字段外,该文件的输出相同。

有没有办法用 gsub 做 perl 等价物,或者用 perl 做 awk 等价物?

帮助表示赞赏!

4

4 回答 4

3

一种使用方式awk

awk '{ for (i=10;i<=11;i++) { $i = substr( $i, 1, 1) } } { print }' infile
于 2013-05-22T19:19:21.360 回答
1

另一种使用gensub函数的方式gawk

gawk '{ for (i=10;i<=11;i++) { $i = gensub(/(.).*/ , "\\1", G , $i) } }1' infile
于 2013-05-22T20:00:39.983 回答
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 字段,也会打印该行。

于 2013-05-22T21:35:19.153 回答
1

perl 的另一种方法:

perl -pe '$c=0; s/(\S+)/(++$c < 10 || $c > 11) ? $1 : substr($1,0,1)/eg' filename
于 2013-05-23T00:06:59.050 回答