2016-07-06 81 views
2

我有一個選項卡刪除文件,我想添加「$」每個變量的結束,我可以用awk,sed或其他方式嗎?如何用awk添加每個變量的字符結尾?

輸入:

a seq1 anot1 
b seq2 anot2 
c seq3 anot3 
d seq4 anot4 

我NEET有這樣:

輸出:

a$ seq1$ anot1$ 
b$ seq2$ anot2$ 
c$ seq3$ anot3$ 
d$ seq4$ anot4$ 

任何答案將理解的,由於

+0

糟糕,您忘了發佈您的代碼! StackOverflow是關於幫助人們修復他們的代碼。這不是免費的編碼服務。任何代碼都比沒有代碼更好。即使你不知道如何編寫它,甚至元代碼也會演示你如何看待程序應該起作用。 – ghoti

回答

1

威特ħsed的:

sed 's/[^ ]*/&$/g' filename 

它取代任何非空間單詞,後跟一個$字(&)。

糟糕!你說標籤。您可以用「\ t」替換上面的空格以使用製表符分隔。

sed 's/[^\t]*/&$/g' filename 

事實上,甚至更好,製表符或空格:

sed 's/[^[:blank:]]*/&$/g' filename 
+0

請注意,'\ t'簡寫在GNU sed(即Linux的大多數版本)中起作用,但它不是通用的。在OS X,FreeBSD,Solaris等下無法使用。你可以使用bash的擴展引用來解決這個問題 - 也就是'$'...'' – ghoti

3

僅在bash下

while read line; do echo "${line//$'\t'/\$$'\t'}\$"; done < file 

這hackish的解決方案依賴於兩個 「特殊」 的事情 - 參數展開進行替換,並格式化擴展以允許分析標籤。

在awk中,你可以更安全地處理領域:

awk -F'\t' 'BEGIN{OFS=FS} {for(n=1;n<=NF;n++){$n=$n "$"}} 1' file 

這個工程通過投入的每一行加強與本身加上美元符號來代替每個領域。 BEGIN塊確保您的輸出將使用與您的輸入相同的字段分隔符。最後的1對於「打印當前行」來說簡直就是awk。

1

AWK是你的朋友:

awk '{for(i=1;i<=NF;i++)sub(/$/,"$",$i);print}' file 

awk '{for(i=1;i<=NF;i++)sub(/$/,"$",$i);}1' file 

樣本輸出

a$ seq1$ anot1$ 
b$ seq2$ anot2$ 
c$ seq3$ anot3$ 
d$ seq4$ anot4$ 

什麼是Happe的寧在這裏?

  1. 使用for-loop我們遍歷記錄中的所有字段。
  2. 我們使用AWK sub功能與$即("$")取代end即(/$/)對於每個記錄($i)。
  3. 明確使用print來打印記錄。數字1也代表打印記錄的默認操作。
2

遲到了......

另一個awk解決方案。前綴字段和記錄分隔符以 「$」

$ awk -F'\t' 'BEGIN{OFS="$"FS; ORS="$"RS} {$1=$1}1' file 
+0

哦,非常好。微妙的+1! – ghoti

0
awk '{gsub(/ /,"$ ")}{print $0 "$\r"}' file 
a$ seq1$ anot1$ 
b$ seq2$ anot2$ 
c$ seq3$ anot3$ 
d$ seq4$ anot4$ 

會發生什麼? 首先用美元符號和新空格替換空格。 回車前最後插入美元符號。

+0

雖然代碼經常爲自己說話,但只包含代碼且沒有文本解釋的答案會被標記爲複審隊列。您可以通過添加一個或兩個解釋來避免這種情況。 – Will

相關問題