希望这对某人来说是一个简单的问题。我很确定我知道我需要使用什么,但我无法弄清楚如何使它工作。这是问题所在:
我有一个平面文件数据库。让我们称之为file.db
以下是file.db
中的一些示例行#file.db
#
line1|example|sample|name|flag|blah
line2|example|sample|name|flag|blah
line3|example|sample|name|flag|blah
基本上,脚本计算tar文件的MD5哈希值。让我们说tar文件的哈希= 1234abcd
我需要将MD5和和另一个分隔符(|)附加到file.db中的特定行
例如:
#file.db
#
line1|example|sample|name|flag|blah
line2|example|sample|name|flag|blah|1234abcd
line3|example|sample|name|flag|blah
它附加到的行当然会由变量控制。我尝试过使用sed和awk,但是无法弄清楚语法。
谢谢你们,现在有解决方案。这是我最终做的事情:
HASH=`md5sum tmp/$URL.tgz | awk '{ print $1 }'`
DBLINE=5
awk -v OFS="|" -v l="$DBLINE" -v h="$HASH" 'NR==l{print $0,h;next}1' databases/$WEB > /tmp/$WEB.tmp && mv /tmp/$WEB.tmp databases/$WEB
谢谢肯特和其他所有回答的人。
答案 0 :(得分:1)
line=2
awk -v line="$line" 'FNR==line {printf("%s%s\n" $0, "|123abcd") ;next}
{print $0}' infile > newfile
答案 1 :(得分:0)
尝试这个awk one-liner:
line=2
awk -v OFS="|" -v l="$line" 'NR==l{print $0,"123abc";next}1'
使用您的示例输入:
kent$ echo "line1|example|sample|name|flag|blah
line2|example|sample|name|flag|blah
line3|example|sample|name|flag|blah"|awk -v OFS="|" -v l="$line" 'NR==l{print $0,"123abc";next}1'
line1|example|sample|name|flag|blah
line2|example|sample|name|flag|blah|123abc
line3|example|sample|name|flag|blah
如果要将输出保存回原始文件:
awk '....' file.db > /tmp/file.db.tmp && mv file.db.tmp /path/to/your/file.db
修改强>
如果您还需要md5哈希的变量:
line=2
hsh="whatever"
awk -v OFS="|" -v l="$line" -v h="$hsh" 'NR==l{print $0,h;next}1'
答案 2 :(得分:0)
看看this quiestion。我想,它有你的答案。 我可以补充一点,你可以在sed中使用正则表达式:
sed '/.*line2.*/ a |123asdfasdf' out.db
答案 3 :(得分:0)
set LN = 5
set MS = 1234abcd
sed -i.bak $LN's/$/|'$MS'/' file.db
这应该有效+