2015-02-23 87 views
0

我有一個長度未知的文本文件。有兩個值在每一行:Bash腳本:按行編輯.txt

VALUE1[SPACE]VALUE2 

現在我已經得到另一個(或相同)有了這樣一個新的列表文件:

0.0.0.0/rep/com/bla/blub/VALUE1/VALUE2/VALUE1-VALUE2.zip 

...每行我都在列出兩個值。我怎樣才能做到這一點?

回答

1

這是awk的一個很好的用例(更新照顧括號中):

awk -F" " '{ gsub("\\(", "", $1); gsub("\\)", "", $2);print "0.0.0.0/rep/com/bla/blub/"$1"/"$2"/"$1"-"$2".zip"}' test.txt > yournewfile.txt 

這將每行分裂以空格,更換開口括號中的第一令牌$1並在第二托克$2更換右括號,然後在它們各自的令牌$1和使用值0您輸出的字符串爲print

+0

這隻適用於第一個值集或不是?我需要逐行進行編輯,以獲得每行與此行的值的鏈接:/ – xsus 2015-02-23 15:24:44

+0

這將遍歷輸入文件中的每一行,並在輸出文件中創建一個新行。 – JNevill 2015-02-23 20:53:10

+0

請取消刪除[您最近的SQL答案](http://stackoverflow.com/a/28683389/57611)。對於除OP之外的其他人仍然有幫助(只要清楚它只能在SQL Server 2012及更高版本中運行)。 – ErikE 2015-02-23 21:28:16

0

我假設VALUE1VALUE2不包含空格,否則第一個定義變得模糊。有了這個假設,您可以使用cut在第一空間分割線構成filename變量使用字符串插值:

cat txt-File | while read VALUE1 VALUE2 _; do 
    filename="0.0.0.0/rep/com/bla/blub/$VALUE1/$VALUE2/$VALUE1-$VALUE2.zip" 

    # Do something with filename... 
    stat "$filename" 
done 
+0

'while read VALUE1 VALUE2 _;做...完成 tripleee 2015-02-23 14:56:53

+0

uff,你可以簡化這個:'cat file |雖然'沒有必要,你可以說'while ... done fedorqui 2015-02-23 14:56:54

+0

我更喜歡領先的'cat file',因爲它明確了循環處理的內容,而不必滾動到底部。修正了另一件事。 – 2015-02-23 15:00:45

0

輸入數據文件的格式爲(VALUE1 VALUE2).。你先刪除初始(,和後者).有很多方法可以做到這一點,這裏是一個

sed 's/(//g' yourfile | sed 's/).//g' 

然後,您可以通過這個交給awk。這裏$1對應於第一列,並$2到第二:

sed 's/(//g' yourfile | sed 's/).//g' | awk '{print "0.0.0.0/rep/com/bla/blub/"$1"/"$2"/"$1"-"$2".zip"}' 
+0

但當我這樣做,它只能在一行或? – xsus 2015-02-23 15:23:16

+0

它適用於所有行。 – swalog 2015-02-23 15:27:16

+0

我建議你自己嘗試一下;-) – swalog 2015-02-23 15:29:01

0

我會用sed此:

sed $'s,^[ \t]*\([^ \t]*\)[ \t][ \t]*\([^ \t]*\).*$,0.0.0.0/rep/com/bla/blub/\1/\2/\1-\2.zip,' filename >new-filename 

如果您願意加入-i.bak您可以修改,以取代原有的文件: sed -i.bak $'s, ... ,'