请耐心等待,因为我不熟悉编写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
答案 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
如果不是全部,那就告诉我们您要做什么,这样我们就可以帮助您以正确的方式做,而不是用创可贴以错误的方式做。