遇到個處理文字檔案的問題
cat test.txt
"355356" "1700870" "1" "0202" ""
"355356" "1700871" "2" "" "02046"
"355356" "1700870" "" "2" "02046"
"1700870" "1700873" "" "1" "0202"
把第2列是1700870的資料改為1700888
起初我得想法是直接用sed,
sed -i "s,1700870,1700888,g" test.txt
得到資料如下,一開始我認為這種方法並無問題,可後來發現犯了很傻的錯誤。 第一列的最後乙個欄位也被替換了。
"355356" "1700888" "1" "0202" ""
"355356" "1700871" "2" "" "02046"
"355356" "1700888" "" "2" "02046"
"1700888" "1700873" "" "1" "0202"
後來用awk去解決這個問題
思路是對第二列等於1700870的行做處理
awk -f "\"" '' test.txt
什麼結果都沒有列印,後來在網上搜了一下,想列印處理過的文字要麼用print,要麼在最後加個1,這裡的1是個省略符,等價於 /.*/ 如下:
awk -f "\"" '1' test.txt
結果如下
355356 1700888 1 0202
"355356" "1700871" "2" "" "02046"
355356 1700888 2 02046
"1700870" "1700873" "" "1" "0202"
不知道為什麼引號沒了,准定不符合規則,原因是在awk處理每一行資料的時候會把輸出分隔符用預設的」空格「代替,所以我們發現每個
處理過的行都沒了引號。
搜尋了一下awk的用法,發現awk用法如下:
$0 表示整個當前行$1 每行第乙個字段
nf 字段數量變數
nr 每行的記錄號,多檔案記錄遞增
fnr 與nr類似,不過多檔案記錄不遞增,每個檔案都從1開始
\t 製表符
\n 換行符
fs begin時定義分隔符 rs
輸入的記錄分隔符, 預設為換行符(即文字是按一行一行輸入)
~ 匹配,與==相比不是精確比較
!~ 不匹配,不精確比較
== 等於,必須全部相等,精確比較
!= 不等於,精確比較
&& 邏輯與
|| 邏輯或
+ 匹配時表示1個或1個以上
/[0-9][0-9]+/ 兩個或兩個以上數字
/[0-9][0-9]*/ 乙個或乙個以上數字
filename 檔名
ofs
輸出字段分隔符, 預設也是空格,可以改為製表符等
ors 輸出的記錄分隔符,預設為換行符,即處理結果也是一行一行輸出到螢幕
-f'[:#/]' 定義三個分隔符
可以在輸出時候自己指定輸出分隔符ofs。
awk -f "\"" ' 1' test.txt
結果如下符合需求:
"355356" "1700888" "1" "0202" ""
"355356" "1700871" "2" "" "02046"
"355356" "1700888" "" "2" "02046"
"1700870" "1700873" "" "1" "0202"
但上面的awk語法太難看,所以改進一下
awk 'begin 1' test.txt
把定義的輸入和輸出字元放到begin裡面,增強了程式的可讀性。
Python修改DBF檔案指定列
一 需求 某公司每日收到一批dbf檔案,a系統實時處理後將其中dealstat欄位置為1 已處理 現在每日晚間b系統也需要處理該檔案,因此需將檔案中dealstat欄位修改為空 未處理 二 分析 1 應建立副本進行修改 解答 使用shutil.copy 2 修改dbf 解答 使用dbf模組。此模組能...
讀取指定列
usr bin env python3 coding utf 8 import xlrd 開啟excel檔案,建立乙個workbook物件,book物件也就是fruits.xlsx檔案,表含有sheet名 rbook xlrd.open workbook key.xlsx sheets方法返回物件列...
awk取文字列 awk用法 取列表最後一列
很多時候我們有需要取出文字中的最後一列,或者比如 ls l 最後一列為檔名,這裡可以使用多種方法取出最後一列 舉例說明 root testserver tmp ls l 總用量 1000 rw r r 1 root root 925223 6月 15 18 06 0615.txt rw r r 1 ...