如何使用awk打印变量值? (代码会打印变量名)

时间:2018-08-16 18:11:21

标签: bash shell unix awk

请耐心等待,因为我不熟悉编写Shell脚本。

输入

元数据

第1栏 A01 A02 A03

第2栏 A_1 A2 A_3 ...

FILENAME(当前格式的示例) (两列名称分别为“井”和“面积”)

Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 62577.5

Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 62688.4

Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 62733.3

Met-test8A-DBMCK_A02_w192E97024-E632-4D00-A525-A4204DEF9ECE 62263.3

Met-test8A-DBMCK_A02_w192E97024-E632-4D00-A525-A4204DEF9ECE 59554

Met-test8A-DBMCK_A02_w192E97024-E632-4D00-A525-A4204DEF9ECE 54602.8

Met-test8A-DBMCK_A02_w192E97024-E632-4D00-A525-A4204DEF9ECE 528.125

Met-test8A-DBMCK_A02_w192E97024-E632-4D00-A525-A4204DEF9ECE 62751.8

Met-test8A-DBMCK_A02_w192E97024-E632-4D00-A525-A4204DEF9ECE 56752.3

Met-test8A-DBMCK_A02_w192E97024-E632-4D00-A525-A4204DEF9ECE 51428.8

Met-test8A-DBMCK_A02_w192E97024-E632-4D00-A525-A4204DEF9ECE 65778

Met-test8A-DBMCK_A02_w192E97024-E632-4D00-A525-A4204DEF9ECE 533.406

Met-test8A-DBMCK_A03_w175F73215-12C2-4E07-8894-795CB8F31A4D 3839.47

Met-test8A-DBMCK_A03_w175F73215-12C2-4E07-8894-795CB8F31A4D 8801.2

Met-test8A-DBMCK_A03_w175F73215-12C2-4E07-8894-795CB8F31A4D 35468.9

Met-test8A-DBMCK_A03_w175F73215-12C2-4E07-8894-795CB8F31A4D 528.125

目标是grep查找包含元数据中第一列(例如A01)中的字符串的行,并在行末添加第二列(例如A_1)中的字符串的新列

那些包含A02的行,得到一个带有A_2的新列 那些包含A03的行,使用A_3获得新列,等等

我有这个脚本,可以完成大部分工作:

#!/bin/bash -l

pop=$1 ### Metadata file 

n=$(wc -l ${pop} | awk '{print $1}')

x=1
while [ $x -le $n ] 
do

        string="sed -n ${x}p ${pop}"
        str=$($string)

                var=$(echo $str | awk '{print $1, $2}')
                set -- $var
               c1=$1   ### e.g. A01 ###
               c2=$2   ### e.g. A_1 ###


                grep ${c1} FILENAME | xargs -d "\n" -rI % echo '% $c2' > ${c1}.data

        x=$(( $x + 1 ))

done

当前输出为:

Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 62577.5 $ c2

Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 62688.4 $ c2

Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 62733.3 $ c2

Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 59593.6 $ c2

Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 66253.3 $ c2

Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 59276.8 $ c2

问题在于它在末尾打印$ c2而不是A_1。

因此,所需的输出将是:

Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 62577.5 A_1

Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 62688.4 A_1

Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 62733.3 A_1

Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 59593.6 A_1

我认为我只是在回显'%$ c2'处使用了不正确的语法,但是诸如$ {c2}或$ 2之类的变体只具有相同的问题。我在网上看过,但目前不确定如何要求正确的语法。由于该文件具有数千行,因此无法手动完成。

非常感谢您的帮助

谢谢

L

2 个答案:

答案 0 :(得分:0)

grep ${c1} FILENAME | xargs -d "\n" -rI % echo '% $c2' > ${c1}.data
     

问题在于它在末尾打印$ c2而不是A_1。

您需要使用双引号来扩展变量,例如echo "% $c2"

答案 1 :(得分:0)

您的问题尚不清楚,但这是您要尝试的全部吗?

$ cat file
Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 62733.3
Met-test8A-DBMCK_A02_w192E97024-E632-4D00-A525-A4204DEF9ECE 62263.3
Met-test8A-DBMCK_A03_w175F73215-12C2-4E07-8894-795CB8F31A4D 3839.47

$ awk -F'_' '{print $0, gensub(/0/,"_",1,$2)}' file
Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 62733.3 A_1
Met-test8A-DBMCK_A02_w192E97024-E632-4D00-A525-A4204DEF9ECE 62263.3 A_2
Met-test8A-DBMCK_A03_w175F73215-12C2-4E07-8894-795CB8F31A4D 3839.47 A_3

上面的代码对gensub()使用GNU awk,但使用了任何awk:

$ awk -F'_' '{new=$2; sub(/0/,"_",new); print $0, new}' file
Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 62733.3 A_1
Met-test8A-DBMCK_A02_w192E97024-E632-4D00-A525-A4204DEF9ECE 62263.3 A_2
Met-test8A-DBMCK_A03_w175F73215-12C2-4E07-8894-795CB8F31A4D 3839.47 A_3

或者您可能需要“元”文件来提供对某些内容的映射,这些内容不像A02-> A_2那样简单易计算,然后就是这个,再加上任何awk:

$ cat meta
A01 whatever
A02 other_stuff
A03 somethin

$ awk 'NR==FNR{map[$1]=$2;next} {print $0, map[$2]}' meta FS='_' file
Met-test8A-DBMCK_A01_w1D27B99D4-0BA0-4AA0-B10A-04558144C3BE 62733.3 whatever
Met-test8A-DBMCK_A02_w192E97024-E632-4D00-A525-A4204DEF9ECE 62263.3 other_stuff
Met-test8A-DBMCK_A03_w175F73215-12C2-4E07-8894-795CB8F31A4D 3839.47 somethin

如果不是全部,那就告诉我们您要做什么,这样我们就可以帮助您以正确的方式做,而不是用创可贴以错误的方式做。