【发布时间】:2019-06-18 04:45:20
【问题描述】:
我有一个输出两个 CSV 列的 bash 脚本。我需要在第二列包含它们的行的三位数字前面加上“f.”,并保持其余行不变。到目前为止,我尝试了不同的方法,但每种方法都以某种方式失败了。
我尝试的主要是使用正则表达式与第一列或第二列将所需的行与其余行分开,但我不能在不取消或弄乱的情况下同时分开和前置以某种方式处理。到目前为止,我使用的一些命令是:$ sed $ cut 以及(嵌套的)for 循环、read-while 循环、if/else 和 if/else/elif 语句等。下面就是这样的一个(失败)解决方案:
for var1 in "^.*_[^f]_.*"
do
sed -i "" "s:$MSname::" $pathToCSV"_final.csv"
for var2 in "^.*_f_.*"
do
sed -i "" "s:$MSname:f.:" $pathToCSV"_final.csv"
done
done
这些是一些示例行:
abc_deg0014_0001_a_1.tif,British Library 1 Front Board Outside
abc_deg0014_0002_b_000.tif,British Library 1 Front Board Inside
abc_deg0014_0003_f_001r.tif,British Library 1 001r
abc_deg0014_0004_f_001v.tif,British Library 1 001v
…
abc_deg0014_0267_f_132r.tif,British Library 1 132r
abc_deg0014_0268_f_132v.tif,British Library 1 132v
abc_deg0014_0269_y_999.tif,British Library 1 Back Board Inside
abc_deg0014_0270_z_1.tif,British Library 1 Back Board Outside
这里 $MSname = British Library 1(由于使用不同的 CSV,“British Library 1”部分可以更改为我需要删除/替换的其他词,这就是我使用参数扩展的原因)。
想要的结果:
abc_deg0014_0002_b_000.tif,Front Board Inside
abc_deg0014_0003_f_001r.tif,f. 001r
…
abc_deg0014_0268_f_132v.tif,f. 132v
abc_deg0014_0269_y_999.tif,Back Board Inside
如果您仔细观察,您会注意到这些行的第一列中的“f”也与其他行区分开来(前面不应有“f.”的行它们的第二列由“a”、“b”、“y”和“z”区分",分别在第一列)。
【问题讨论】:
-
您将变量
var1设置为字符串^.*_[^f]_.*,类似地var2,但您从不使用这些变量。拥有它们有什么意义? -
一个
for对单个字符串的循环相当于只是将字符串分配给循环变量,只是你可以break退出循环直接进入后面的行done(无论如何你都不会在这里使用)。 -
我取消了 for 循环,但你是对的。