Awk 在不更改索引的情况下更改列if条件中的值
以下是我需要更改的一些值: 如果第一列为2=>1 如果第一列为8=>2 如果第一列为16=>3Awk 在不更改索引的情况下更改列if条件中的值,awk,Awk,以下是我需要更改的一些值: 如果第一列为2=>1 如果第一列为8=>2 如果第一列为16=>3 CHR SNP BP A1 TEST NMISS BETA STAT P 2 rs10173732 31404 A ADD 2607 -0.02162 -1.552 0.1207 2 rs10173732
CHR SNP BP A1 TEST NMISS BETA STAT P
2 rs10173732 31404 A ADD 2607 -0.02162 -1.552 0.1207
2 rs10173732 31404 A COV1 2607 0.2659 24.15 1.849e-116
2 rs11684864 2547285 G ADD 2596 -0.009581 -0.6387 0.5231
2 rs11684864 2547285 G COV1 2596 0.2672 24.18 1.212e-116
2 rs11684864 2547285 G COV2 2596 0.004941 9.564 2.548e-21
8 rs3826201 88651817 T COV3 2576 -0.0186 -15.7 4.335e-53
16 rs8047319 88684276 C ADD 2538 0.01115 1.271 0.204
16 rs8047319 88684276 C COV1 2538 0.2632 23.73 1.402e-112
16 rs8047319 88684276 C COV2 2538 0.005039 9.715 6.276e-22
16 rs8047319 88684276 C COV3 2538 -0.01891 -15.9 2.583e-54
但是,此命令并不方便,因为它会更改缩进,并且带有8的行似乎不太适合:
awk '{ if ( $1 == 2 ) { $1 = 1 } else if ( $1 == 8 ) { $1 == 2 } else if ( $1 == 16 ) { $1 = 3 }; print}' TEST > TESTnew
输出:
CHR SNP BP A1 TEST NMISS BETA STAT P
1 rs10173732 31404 A ADD 2607 -0.02162 -1.552 0.1207
1 rs10173732 31404 A COV1 2607 0.2659 24.15 1.849e-116
1 rs11684864 2547285 G ADD 2596 -0.009581 -0.6387 0.5231
1 rs11684864 2547285 G COV1 2596 0.2672 24.18 1.212e-116
1 rs11684864 2547285 G COV2 2596 0.004941 9.564 2.548e-21
8 rs3826201 88651817 T COV3 2576 -0.0186 -15.7 4.335e-53
3 rs8047319 88684276 C ADD 2538 0.01115 1.271 0.204
3 rs8047319 88684276 C COV1 2538 0.2632 23.73 1.402e-112
3 rs8047319 88684276 C COV2 2538 0.005039 9.715 6.276e-22
3 rs8047319 88684276 C COV3 2538 -0.01891 -15.9 2.583e-54
您如何更正更通用的内容(即即使特定行的缩进不同,它也可以工作),并且不会改变原始文件的缩进?您可以在
sed
中进行替换:
sed 's/^\( *\)2/\11/ ; s/^\( *\)8/\12/ ; s/^\( *\)16/\1 3/'
这将在一个脚本中完成所有三个替换
^\(*\)
捕获行首和数字之前的所有空格<代码>\1替换它们以保留缩进。出于同样的原因,我将16
替换为3
。替换为GNU awk,以匹配第三个参数()
如果1、2和3值只是一个增量索引:
$ awk 'BEGIN{split("2 8 16",t); for (i in t) m[t[i]]=i} $1 in m{match($0,/(\s*\S+)(.*)/,a); $0=sprintf("%*s",length(a[1]),m[$1]) a[2]} 1' file
CHR SNP BP A1 TEST NMISS BETA STAT P
1 rs10173732 31404 A ADD 2607 -0.02162 -1.552 0.1207
1 rs10173732 31404 A COV1 2607 0.2659 24.15 1.849e-116
1 rs11684864 2547285 G ADD 2596 -0.009581 -0.6387 0.5231
1 rs11684864 2547285 G COV1 2596 0.2672 24.18 1.212e-116
1 rs11684864 2547285 G COV2 2596 0.004941 9.564 2.548e-21
2 rs3826201 88651817 T COV3 2576 -0.0186 -15.7 4.335e-53
3 rs8047319 88684276 C ADD 2538 0.01115 1.271 0.204
3 rs8047319 88684276 C COV1 2538 0.2632 23.73 1.402e-112
3 rs8047319 88684276 C COV2 2538 0.005039 9.715 6.276e-22
3 rs8047319 88684276 C COV3 2538 -0.01891 -15.9 2.583e-54
或者根本不需要指定现有的$1值:
$ awk 'NR>1{ if ($1!=p) {c++; p=$1} match($0,/(\s*\S+)(.*)/,a); $0=sprintf("%*s",length(a[1]),c) a[2]} 1' file
CHR SNP BP A1 TEST NMISS BETA STAT P
1 rs10173732 31404 A ADD 2607 -0.02162 -1.552 0.1207
1 rs10173732 31404 A COV1 2607 0.2659 24.15 1.849e-116
1 rs11684864 2547285 G ADD 2596 -0.009581 -0.6387 0.5231
1 rs11684864 2547285 G COV1 2596 0.2672 24.18 1.212e-116
1 rs11684864 2547285 G COV2 2596 0.004941 9.564 2.548e-21
2 rs3826201 88651817 T COV3 2576 -0.0186 -15.7 4.335e-53
3 rs8047319 88684276 C ADD 2538 0.01115 1.271 0.204
3 rs8047319 88684276 C COV1 2538 0.2632 23.73 1.402e-112
3 rs8047319 88684276 C COV2 2538 0.005039 9.715 6.276e-22
3 rs8047319 88684276 C COV3 2538 -0.01891 -15.9 2.583e-54
我删掉了第一行。这不是胡说八道,就是你承认浪费了我们的时间。不管怎样,这都是不合适的。除此之外,好问题,您是否愿意使用
sed
?好的,谢谢!当然,我愿意使用sed
。只是我不熟悉在不同的条件下使用它,但是欢迎任何好的想法。我只是在这里找到了如何做到这一点:。显然,这只是分号,而不是使用print
打印行,您可以使用printf()
指定列宽。感谢您将我推到10k以上!Ed你肯定可以用awk一号线偷走死星计划!我以为我很了解awk。。。
$ awk 'NR>1{ if ($1!=p) {c++; p=$1} match($0,/(\s*\S+)(.*)/,a); $0=sprintf("%*s",length(a[1]),c) a[2]} 1' file
CHR SNP BP A1 TEST NMISS BETA STAT P
1 rs10173732 31404 A ADD 2607 -0.02162 -1.552 0.1207
1 rs10173732 31404 A COV1 2607 0.2659 24.15 1.849e-116
1 rs11684864 2547285 G ADD 2596 -0.009581 -0.6387 0.5231
1 rs11684864 2547285 G COV1 2596 0.2672 24.18 1.212e-116
1 rs11684864 2547285 G COV2 2596 0.004941 9.564 2.548e-21
2 rs3826201 88651817 T COV3 2576 -0.0186 -15.7 4.335e-53
3 rs8047319 88684276 C ADD 2538 0.01115 1.271 0.204
3 rs8047319 88684276 C COV1 2538 0.2632 23.73 1.402e-112
3 rs8047319 88684276 C COV2 2538 0.005039 9.715 6.276e-22
3 rs8047319 88684276 C COV3 2538 -0.01891 -15.9 2.583e-54