0

希望这对那里的人来说是一个简单的问题。我很确定我知道我需要使用什么,但我不知道如何使它工作。这是问题:

我有一个平面文件数据库。让我们称之为 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

谢谢肯特,以及其他所有回答的人。

4

4 回答 4

1
line=2
awk -v line="$line" 'FNR==line {printf("%s%s\n" $0, "|123abcd") ;next}
                     {print $0}' infile > newfile
于 2013-04-15T09:35:45.063 回答
0

试试这个 awk 单线:

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'
于 2013-04-15T09:45:26.310 回答
0

看看这个问题。我想,它有你的答案。我可以补充一点,您可以在 sed 中使用正则表达式模式:

sed '/.*line2.*/ a |123asdfasdf' out.db
于 2013-04-15T09:46:52.983 回答
0
set LN = 5
set MS = 1234abcd
sed -i.bak $LN's/$/|'$MS'/' file.db

这应该工作+

于 2013-04-15T10:12:02.833 回答