2016-11-04 55 views
0

我有成千上萬個像這樣的(例如)化學座標名爲.xyz文件:如何在第一行命令之前在新行中插入總行數?

Fe  0.000000000  0.000000000  0.000000000 
    C  2.112450000  0.000000000  0.000000000 
    C  0.039817193  1.817419422  0.000000000 

我尋覓了很多關於一個簡單的命令,像sed或頭部和尾部,寫的統計數(使用換行符\ n並在總數前加兩個空格),但不能成功。 我真的很感激任何幫助。 輸出MST是這樣的:

3 
Fe  0.000000000  0.000000000  0.000000000 
C  2.112450000  0.000000000  0.000000000 
C  0.039817193  1.817419422  0.000000000 
+1

@John Zwinck感謝編輯 – Amir

+0

類似於'cat <(printf「$(wc -l <​​file.xyz)\ n」)file.xyz'? – Sundeep

回答

1

你可以做到這一點作爲一個複合命令:

(wc -l < fileA && cat fileA) > outputA 

請注意,我用<有確保wc不打印在第一行的文件名。至少在Mac OS上,如果你不使用那樣的重定向的話。


編輯:如果您需要將相同的應用到許多文件:

mkdir output 
ls *.xyz | while read filename; do 
    (wc -l < $filename && cat $filename) > output/$filename 
done 

只是爲了好玩,這裏有一個命令,你應該使用,但在某些情況下工作:

tee xxx < fileA | wc -l > xxx # don't do this 
+0

感謝您的回覆。第一個命令適用於一個文件,但在超過5000個文件的情況下,我必須對此命令進行哪些更改才能保留文件名並分別對所有文件執行此操作? (例如「* .xyz」) – Amir

+0

@Amir:我添加了一個在所有'* .xyz'文件上編寫循環的示例。 –

+0

非常感謝,它以完美的方式解決了我的問題。我真的很感謝你的幫助 – Amir

1

試試這個:

sed '1i \ 
'$(wc -l < file.xyz) file.xyz 

要處理多個文件find和使用-i標誌到位編輯文件

find . -name '*.xyz' -exec sh -c 'sed -i "1s/.*/$(wc -l < {})\n&/" {}' \; 

NB:的文件將在地方用這個命令來編輯,您可能希望首先檢查輸出。爲此,請在sed後刪除-i標誌。如果命令滿足您的需求,則再次添加-i標誌。

+0

感謝您的幫助和有用的評論。 – Amir

相關問題