2013-04-15 184 views
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,但只是無法弄清楚語法。

UPDATE

謝謝大家,現在有解決方案。這是我最終做的:

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

中有什麼變化?該線路如何改變與其他線路不同? – choroba

+1

'awk'對於行數有'NR'。這可能會幫助你。 – fedorqui

回答

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' 
+0

非常好,這似乎是工作,但我似乎無法使用一個變量,你有散列當前(123abc) – Atomiklan

+0

@ user2272450是的,你可以。請參閱編輯答案。 – Kent

+0

非常感謝你! – Atomiklan

1
line=2 
awk -v line="$line" 'FNR==line {printf("%s%s\n" $0, "|123abcd") ;next} 
        {print $0}' infile > newfile 
+0

謝謝,但我最終找到了一個類似的解決方案。查看原始帖子中的更新。 – Atomiklan

0

this quiestion看看。我想,它有你的答案。 我可以補充一點,你可以在SED使用正則表達式模式:

sed '/.*line2.*/ a |123asdfasdf' out.db 
+0

謝謝,但我最終找到了一個類似的解決方案。查看原始帖子中的更新。 – Atomiklan

0
set LN = 5 
set MS = 1234abcd 
sed -i.bak $LN's/$/|'$MS'/' file.db 

這應該工作+

+0

謝謝,但我最終找到了一個類似的解決方案。查看原始帖子中的更新。 – Atomiklan