2014-02-07 141 views
0

假設我有一個vi文件如下所示:如何在Vi文件的每行末尾添加一些命令輸出?

貓file1的

abc 123 pqr 
lmn 234 rst 
jkl 100 mon 

我想利用每一行的第二場(即,在這種情況下是123,234和100)和附加它到了同一行的末尾。 我該怎麼做?

輸出應該如下所示:

abc 123 pqr 123 
lmn 234 rst 234 
jkl 100 mon 100 
+0

awk還就行了。 –

回答

3

隨着awk

$ awk '{NF=NF+1; $NF=$2}1' file 
abc 123 pqr 123 
lmn 234 rst 234 
jkl 100 mon 100 

它增加在一個場的數量,並且最後一個作爲第二。然後1是一個真實的條件,它被評估爲默認的awk行爲:{print $0}

或者也

awk '{print $0, $2}' file 

它打印全線加上第二場。

或者更短,thanks Håkon Hægland!

awk '{$(NF+1)=$2}1' file 
+0

我試過這個:awk'{NF = NF + 1; $ NF = $ 3} 1'bteq_files> bteq_files。但文件被清空了。這是爲什麼?沒有重定向,我在提示符下得到了正確的輸出。 –

+0

您無法從文件讀取並重定向到同一個文件。相反,使用一個臨時文件,然後將其移動到原始位置:'awk'{NF = NF + 1; $ NF = $ 2} 1'文件> temp_file && mv temp_file文件' – fedorqui

+0

另外,在這個命令中,在結束大括號之後的'1'是做什麼的? –

1

你有很多方法可以做到,在六(M)。這是在我腦海中最簡單的:

​​

說明:

  • :{range}norm command{range}
  • %每行執行正常模式command是一條捷徑範圍,意思是「緩衝區中的所有行「所以我們將執行緩衝區中每行的後續內容
  • 0將光標置於當前行的第一列(不嚴格必要的,但好的做法)
  • f<space>跳到第一<space>光標,光標在當前行
  • yaw後猛拉字光標
  • $跳轉到該行的末尾下<space>
  • p粘貼先前抽出的文本
+0

你能否分解這個命令並解釋它在做什麼? –

+0

@AjimBagwan,完成。 – romainl

+0

@romanil:非常整齊!還有一個問題:如果我希望光標在當前光標位置後的第二個空格上跳轉,該怎麼辦?我用什麼來代替0f? –

-1

提示與標記,你可以在vi

:%s/\([^ ]*\)\(.*\)/\1\2\1/ 

另一種方法,使用的sed

sed -r 's/([^ ]*)(.*)/\1\2\1/' file 
+0

是不是針對vi的問題? – LordT

+0

不是,接受者不使用vi – BMW

+2

感謝您計算出使用哪種正則表達式。這導致OP可以完全在vim中完成它的一種方式:type':%s/\([^] * \)\(。* \)/ \ 1 \ 2 \ 1 /' –

相關問題