【发布时间】:2018-08-16 18:11:20
【问题描述】:
由于我是编写 shell 脚本的新手,请多多包涵。
输入
元数据
第 1 列 A01 A02 A03
第 2 列 A_1 A2 A_3 ...
FILENAME(当前格式示例) (2 列名称 Well 和 Area)
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
我认为我只是在 echo '% $c2' 处使用了不正确的语法,但诸如 ${c2} 或 $2 之类的变体只有相同的问题。我在网上查看过,但目前不确定如何要求正确的语法。由于此文件有数千行,因此无法手动执行。
非常感谢任何帮助
谢谢
L
【问题讨论】:
-
您的方法是错误的 - 请参阅 why-is-using-a-shell-loop-to-process-text-considered-bad-practice 了解您的脚本的一些问题,但不是所有问题。如果您需要帮助,请按照@Cyrus 的建议做您正在尝试以正确方式做的任何事情。