2014-02-19 71 views
1

想知道你是否可以幫助我。 我想要做的是將文件的最後一行移動到文件的第二行。最後一行到第一行

文件記錄正在動態變化,所以最後一行不是硬編碼的行號。

當前$FILE輸出:

  1. ---頁腳---
  2. 數據
  3. 狀態(沒有數據記錄)echo -e "\n$CALC"

我所試圖實現後上面生成的文件是以下輸出:

  1. ---頁腳---
  2. 狀態(沒有記錄數據)echo -e "\n$CALC"
  3. 數據

$CALC爭奪該文件的輸出,並做wc -l

狀態通過使用在當前文件生成後設置的env $CALC來統計文件中的記錄數量。很顯然,如果我在將文件數據記錄在文件'wc'之前移動$CALC將會失敗。

是否有辦法以某種方式移動生成的$ FILE輸出的最後一行並將其移動到第二行?

我想出了一個位,它會刪除最後一個文件(最後一行的複製到第二個行之後需要完成)

sed '$d' < $FILE > tmp 
mv tmp $FILE 

任何提示答案讚賞

+0

我們有'tac'命令貓inversly ...好? – MLSC

+0

問題不在於扭轉輸出,數據可以(可以猜測)是多行。 – Nit

+0

嗨,不是真的。 TAC將「反轉」文件及其輸出。我需要的是移動最後一行,其中包含$ CALC的正確輸出,並將其放在$ FILE的第二行。 – user3327055

回答

0

這AWK您oneliner工作需要:

awk '{a[NR]=$0}END{for(x=1;x<NR;x++){if(x==2)print a[NR];print a[x]}}' file 

,如果你想在最後一行移動到比第二其它一些線,你可以改變x==2到其他值。

測試:

kent$ seq 5|awk '{a[NR]=$0}END{for(x=1;x<NR;x++){if(x==2)print a[NR];print a[x]}}' 
1 
5 
2 
3 
4 
+0

謝謝。它100%的工作,並做的工作:)我會有這個代碼revieved更好地瞭解它的工作原理。 – user3327055

0

您可以使用sed這樣的:

last=$(tail -1 file) 
sed -i.bak -e "2s/^/$last\n/" -e '$d' file 

---FOOTER--- 
status (no of records in data) echo -e "\n$CALC" 
data 
+1

非常感謝所有這樣的快速反應。我會通過這些方式檢查並確認。 乾杯:) – user3327055

+0

當然,如果遇到任何問題,請告訴我。 – anubhava

0
(head -1 input; tail -1 input; tail -n +2 input | head -n -1) > output 

我敢肯定有更好的方法。

0

使用數組純巴什解決方案:

mapfile array < input 

printf "%s" "${array[0]}" "${array[ -1]}" "${array[@]:1:${#array[@]}-2}" 
相關問題