2015-04-16 87 views
-1

我有有數百個記錄在下面格式的文件:如何刪除記錄中的特定模式?

20150416110321|21,VPLA,91974737XXX5|91974737XXX5,404192086271201|404192086271201,SAI-IMEISV,gsn65.xxxxx.com,gsn65.xxxxx.com;1429148977;301814701;11276100,100.XX.199.250|100.XX.199.XXX|,1,SAIOLU-Location,SAIOLU-LG,2,internet|internet,,SAIOLU-SGSNIP,6,AL,AL_F_1_25G40K_2_25G20K_28|KL_BASIC,,UNKNOWN,SAIOLU-MK,UNKNOWN,SAIOLU-MBRUL,SAIOLU-MBRDL,,,,SAI-IMEI,,,, 

我想利用僅在字段/列1-8的管分離的數據的第一部分。我怎麼用awk/sed來做到這一點?

例如:

20150416110321,VPLA,91974737XXX5,404192086271201,SAI-IMEISV,gsn65.xxxxx.com;1429148977;301814701;11276100,100.XX.199.250,1,SAIOLU-Location,SAIOLU-LG,2,internet|internet,,SAIOLU-SGSNIP,6,AL,AL_F_1_25G40K_2_25G20K_28|KL_BASIC,,UNKNOWN,SAIOLU-MK,UNKNOWN,SAIOLU-MBRUL,SAIOLU-MBRDL,,,,SAI-IMEI,,,, 

感謝

+0

@Ed莫頓:你好,請仔細閱讀這個問題,我寫了我有幾百個文件以下格式的記錄。其次,這是管道的第一部分應該被輸出的要求。我希望我回答了您的問題,謝謝 – Vieypul

回答

0

你可以用awk。

$ awk -F, -v OFS="," '{for(i=1;i<=8;i++)sub(/\|.*/,"",$i)}1' file 
20150416110321,VPLA,91974737XXX5,404192086271201,SAI-IMEISV,gsn65.xxxxx.com,gsn65.xxxxx.com;1429148977;301814701;11276100,100.XX.199.250,1,SAIOLU-Location,SAIOLU-LG,2,internet|internet,,SAIOLU-SGSNIP,6,AL,AL_F_1_25G40K_2_25G20K_28|KL_BASIC,,UNKNOWN,SAIOLU-MK,UNKNOWN,SAIOLU-MBRUL,SAIOLU-MBRDL,,,,SAI-IMEI,,,, 
+0

感謝您的回覆。它爲我工作。我只有一個問題:awk中是否有「sed -i」的等價物。我的意思是我想在這個文件中只寫這些修改而不重定向。 – Vieypul

+0

最好使用awk,因爲你想在有限的字段上進行替換,即最多8個。 –

+0

是的我只想使用awk,但想寫在同一個文件中再次進行更改。所以我問是否有像我們在sed中有的「-i」選項類型。無論如何,感謝上述解決方案,它按照要求工作。 ! – Vieypul

0
sed ':cycle 
s/^\(\([^,]*,\)\{0,7\}[^,|]*\)|[^,]*/\1/;t cycle' YourFile 

遞歸刪除|和明年,列入第8組獨立之間的所有內容由,

+0

嗨@NeronLe感謝分享命令,這正是我在尋找的東西,一個可以編輯文件本身的sed命令,但是我面臨着一個問題這裏當我正常運行這個命令時,它在命令行上運行的很完美,但是當我在腳本中運行這個命令時,它不會顯示任何錯誤或者任何輸出結果#!/ usr/bin/perl my $ cmd2 ='sed -i':cycle s/^ \(\([^,] *,\)\ {0,13 \} [^,|] * \)| [^,] */\ 1/\; t週期'vpl '; 系統($ cmd2); – Vieypul

+0

肯定是一個shell解釋,你需要轉義一些部分。在調試命令中用'set -vx;'以sed的形式嘗試。您也可以將sed動作放在一個文件中,並通過'sed -i -f YourSedAction.file vpl'調用它。現在,從perl調用,直接在perl本身當然有更好的方法 – NeronLeVelu

+0

你能告訴我如何在Perl腳本中實現這一點嗎?我以爲我需要在perl腳本中使用sed? – Vieypul