国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何把awk腳本移植到Python

開發 后端
將一個 awk 腳本移植到 Python 主要在于代碼風格而不是轉譯。腳本是解決問題的有效方法,而 awk 是編寫腳本的出色語言。它特別擅長于簡單的文本處理,它可以帶你完成配置文件的某些復雜重寫或目錄中文件名的重新格式化。

[[285020]]

將一個 awk 腳本移植到 Python 主要在于代碼風格而不是轉譯。

腳本是解決問題的有效方法,而 awk 是編寫腳本的出色語言。它特別擅長于簡單的文本處理,它可以帶你完成配置文件的某些復雜重寫或目錄中文件名的重新格式化。

何時從 awk 轉向 Python

但是在某些方面,awk 的限制開始顯現出來。它沒有將文件分解為模塊的真正概念,它缺乏質量錯誤報告,并且缺少了現在被認為是編程語言工作原理的其他內容。當編程語言的這些豐富功能有助于維護關鍵腳本時,移植將是一個不錯的選擇。

我最喜歡的完美移植 awk 的現代編程語言是 Python。

在將 awk 腳本移植到 Python 之前,通常值得考慮一下其原始使用場景。例如,由于 awk 的局限性,通常從 Bash 腳本調用 awk 代碼,其中包括一些對 sed、sort 之類的其它命令行常見工具的調用。 最好將所有內容轉換為一個一致的 Python 程序。有時,腳本會做出過于寬泛的假設,例如,即使實際上只運行一個文件,該代碼也可能允許任意數量的文件。

在仔細考慮了上下文并確定了要用 Python 替代的東西之后,該編寫代碼了。

標準 awk 到 Python 功能

以下 Python 功能是有用的,需要記住:

  1. with open(some_file_name) as fpin:
  2.     for line in fpin:
  3.         pass # do something with line

此代碼將逐行循環遍歷文件并處理這些行。

如果要訪問行號(相當于 awk 的 NR),則可以使用以下代碼:

  1. with open(some_file_name) as fpin:
  2.     for nr, line in enumerate(fpin):
  3.         pass # do something with line

在 Python 中實現多文件的 awk 式行為

如果你需要能夠遍歷任意數量的文件同時保持行數的持續計數(類似 awk 的 FNR),則此循環可以做到這一點:

  1. def awk_like_lines(list_of_file_names):
  2.     def _all_lines():
  3.         for filename in list_of_file_names:
  4.             with open(filename) as fpin:
  5.                 yield from fpin
  6.     yield from enumerate(_all_lines())

此語法使用 Python 的生成器yield from 來構建迭代器,該迭代器將遍歷所有行并保持一個持久計數。

如果你需要同時使用 FNRNR,這是一個更復雜的循環:

  1. def awk_like_lines(list_of_file_names):
  2.     def _all_lines():
  3.         for filename in list_of_file_names:
  4.             with open(filename) as fpin:
  5.                 yield from enumerate(fpin)
  6.     for nr, (fnr, line) in _all_lines:
  7.         yield nr, fnr, line

更復雜的 FNR、NR 和行數的 awk 行為

如果 FNR、NR 和行數這三個你全都需要,仍然會有一些問題。如果確實如此,則使用三元組(其中兩個項目是數字)會導致混淆。命名參數可使該代碼更易于閱讀,因此最好使用 dataclass

  1. import dataclass
  2.  
  3. @dataclass.dataclass(frozen=True)
  4. class AwkLikeLine:
  5.     content: str
  6.     fnr: int
  7.     nr: int
  8.  
  9. def awk_like_lines(list_of_file_names):
  10.     def _all_lines():
  11.         for filename in list_of_file_names:
  12.             with open(filename) as fpin:
  13.                 yield from enumerate(fpin)
  14.     for nr, (fnr, line) in _all_lines:
  15.         yield AwkLikeLine(nr=nr, fnr=fnr, line=line)

你可能想知道,為什么不一直用這種方法呢?使用其它方式的的原因是總用這種方法太復雜了。如果你的目標是把一個通用庫更容易地從 awk 移植到 Python,請考慮這樣做。但是編寫一個可以使你確切地了解特定情況所需的循環的方法通常更容易實現,也更容易理解(因而易于維護)。

理解 awk 字段

一旦有了與一行相對應的字符串,如果要轉換 awk 程序,則通常需要將其分解為字段。Python 有幾種方法可以做到這一點。這將把行按任意數量的連續空格拆分,返回一個字符串列表:

  1. line.split()

如果需要另一個字段分隔符,比如以 : 分隔行,則需要 rstrip 方法來刪除最后一個換行符:

  1. line.rstrip("\n").split(":")

完成以下操作后,列表 parts 將存有分解的字符串:

  1. parts = line.rstrip("\n").split(":")

這種拆分非常適合用來處理參數,但是我們處于偏差一個的錯誤場景中?,F在 parts[0] 將對應于 awk 的 $1,parts[1] 將對應于 awk 的 $2,依此類推。之所以偏差一個,是因為 awk 計數“字段”從 1 開始,而 Python 從 0 開始計數。在 awk 中,$0 是整個行 —— 等同于 line.rstrip("\n"),而 awk 的 NF(字段數)更容易以 len(parts) 的形式得到。

移植 awk 字段到 Python

例如,讓我們將這個單行代碼“如何使用 awk 從文件中刪除重復行”轉換為 Python。

awk 中的原始代碼是:

  1. awk '!visited[$0]++' your_file > deduplicated_file

“真實的” Python 轉換將是:

  1. import collections
  2. import sys
  3.  
  4. visited = collections.defaultdict(int)
  5. for line in open("your_file"):
  6.     did_visit = visited[line]
  7.     visited[line] += 1
  8.     if not did_visit:
  9.         sys.stdout.write(line)

但是,Python 比 awk 具有更多的數據結構。與其計數訪問次數(除了知道是否看到一行,我們不使用它),為什么不記錄訪問的行呢?

  1. import sys
  2.  
  3. visited = set()
  4. for line in open("your_file"):
  5.     if line in visited:
  6.         continue
  7.     visited.add(line)
  8.     sys.stdout.write(line)

編寫 Python 化的 awk 代碼

Python 社區提倡編寫 Python 化的代碼,這意味著它要遵循公認的代碼風格。更加 Python 化的方法將區分唯一性和輸入/輸出的關注點。此更改將使對代碼進行單元測試更加容易:

  1. def unique_generator(things):
  2.     visited = set()
  3.     for thing in things:
  4.         if thing in visited:
  5.             continue
  6.         visited.add(things)
  7.         yield thing
  8.  
  9. import sys
  10.    
  11. for line in unique_generator(open("your_file")):
  12.     sys.stdout.write(line)

將所有邏輯置于輸入/輸出代碼之外,可以更好地分離問題,并提高代碼的可用性和可測試性。

結論:Python 可能是一個不錯的選擇

將 awk 腳本移植到 Python 時,通常是在考慮適當的 Python 代碼風格時重新實現核心需求,而不是按條件/操作進行笨拙的音譯。考慮原始上下文并產生高質量的 Python 解決方案。雖然有時候使用 awk 的 Bash 單行代碼可以完成這項工作,但 Python 編碼是通往更易于維護的代碼的途徑。 

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2016-10-08 20:58:50

awkLinux編寫腳本

2015-05-05 13:57:12

AndroidWindows

2010-09-27 16:26:09

JVMarm

2011-03-17 17:36:01

iptables嵌入式Linux

2011-05-12 13:48:07

MySql數據庫本地移植

2012-05-18 20:30:19

微軟 Android ap

2011-05-04 09:29:22

2015-05-05 10:16:17

AndroidWindows

2023-06-07 09:00:00

JavaScript開發TypeScript

2020-10-19 10:28:58

liteos-a移植STM32MP157

2010-08-12 10:43:36

DB2 SQL移植

2016-08-10 16:07:08

awkLinux開源

2021-06-27 17:40:49

安全DevOpsDevSecOps

2022-11-09 10:33:39

awk腳本Groovy

2016-08-11 09:18:33

awkShellLinux

2011-08-05 10:40:54

2016-07-29 15:13:00

awk文本處理工具編程

2011-01-13 14:19:41

solarisLinux

2013-02-21 14:08:18

TizenTizen image

2009-10-10 13:54:20

OPhone
點贊
收藏

51CTO技術棧公眾號

一区二区三区视频免费视频观看网站| 欧美激情在线观看| 少妇人妻在线视频| 蜜桃av噜噜一区二区三区小说| 国产精品自产拍在线观看中文| 九九视频免费观看视频精品| 国产精品91在线观看| 精品在线观看入口| 国产裸体写真av一区二区| 91精品国产乱码久久久久久久| 国产精品美女av| 888久久久| 国产一区二区三区四区hd| 在线播放一区| 日本欧美色综合网站免费| 美腿丝袜亚洲色图| 人妻少妇精品久久| av午夜一区麻豆| 乌克兰美女av| 图片区日韩欧美亚洲| 亚洲二区在线播放视频| 狠狠做六月爱婷婷综合aⅴ| 国产一区高清视频| 色婷婷综合视频在线观看| 米奇777四色精品人人爽| 欧美色国产精品| 亚洲综合精品自拍| 日本成在线观看| 亚洲电影一级黄| 天天综合视频在线观看| 日韩大陆欧美高清视频区| 精品一区二区三区中文字幕在线 | 男女裸体影院高潮| ww久久中文字幕| 好吊妞这里只有精品| 日韩欧美在线一区| 欧美极品videos大乳护士| 欧美成年人视频网站欧美| 色天天综合网| 一本久道久久综合狠狠爱亚洲精品| 成人免费毛片aaaaa**| 激情视频国产| 欧美一区日本一区韩国一区| 欧美黄色成人| 91在线色戒在线| 国产成人精品午夜视频免费| 国产经典视频一区| 精品日韩欧美一区二区| 国产极品模特精品一二| 国产乱码一区| 91美女片黄在线| 久草在现在线| www.亚洲人.com| 欧美日韩国产高清| 一区二区传媒有限公司| 欧美日韩国产综合视频在线观看中文| 超碰97免费在线| 国产91色在线| 久草精品在线观看| 濑亚美莉vs黑人在线观看| 九色|91porny| 牛牛影视一区二区三区免费看| 日日噜噜噜夜夜爽亚洲精品 | 在线视频亚洲自拍| 国产欧美一二三区| 色综合久久久久综合一本到桃花网| 狠狠热免费视频| 欧美中文字幕一二三区视频| 在线观看wwwxxxx| 午夜精品久久久久久久久久久久| 亚洲香蕉网站| 一路向西2在线观看| 日韩免费在线观看| 日韩av资源网| 国产成人免费精品| 成黄免费在线| 欧美精品videosex牲欧美| 国产精品对白| 日本黄大片一区二区三区| 亚洲欧美另类小说| 白白色 亚洲乱淫| 97最新国自产拍视频在线完整在线看| 日韩视频一区在线| 石原莉奈在线亚洲二区| a4yy在线播放免费观看视频| 亚洲天堂影视av| 国产日韩综合| 飘雪影视在线观看免费观看 | 国产一区二区三区日韩精品| 黄网站色视频免费观看| 制服丝袜亚洲网站| 国产精品成人a在线观看| 中文字幕国产免费| 丝袜美腿精品国产二区| 亚洲欧美视频| av成人手机在线| 国产精品永久免费观看| 亚洲国产精品av| 国产精品久久久久久妇女| 欧美不卡一二三| 国产亚洲人成网站| 精品日韩99亚洲| 欧美 亚欧 日韩视频在线 | 深夜福利91大全| 久久久国产精品午夜一区ai换脸| 国产精品一区二区三区在线观| 日韩av一卡二卡| 日韩一区二区久久| 亚洲影视综合| 最近的2019中文字幕免费一页 | 九色在线网站| 欧美日韩在线视频首页| 欧美综合影院| 精品一区毛片| 国产精品沙发午睡系列| 日韩人妻无码精品久久久不卡| 91精品国产91久久久久久最新毛片| 国产毛片精品一区| 久久久精品国产**网站| 日韩伦理av| 99色在线视频| 国产精品视频yy9099| 欧美福利电影网| 夜色激情一区二区| 亚洲成人福利片| 亚洲乱码国产乱码精品精的特点 | 91制片在线观看| 激情五月开心婷婷| 一区二区精品国产| 国产精品久久久久不卡| 久久99精品久久久久久青青91 | 欧美性猛交7777777| 青青久久av北条麻妃黑人| www.神马久久| 四色永久免费网站| 77777少妇光屁股久久一区| 亚洲日本电影在线| 欧美日一区二区| 亚洲一区在线日韩在线深爱| 国产精品美女无圣光视频| 亚洲成人福利片| 在线视频观看日韩| 涩涩涩视频在线观看| 国产亚洲天堂网| 国产成人一区二区在线| 欧美性xxxx极品高清hd直播| 亚洲一区二区成人| 成人福利片在线| 色琪琪原网站亚洲香蕉| 91在线观看免费观看| 日韩美女主播在线视频一区二区三区| 国产一区二区精品久久99| 蜜桃精品一区二区三区| eeuss在线观看| 裸体丰满少妇做受久久99精品 | 黄色直播在线| 国产一区精品在线| 精品无人国产偷自产在线| 国产色产综合产在线视频| 午夜av一区| 欧美magnet| 日本一本视频| 日韩av电影免费播放| 欧美成年人视频网站| 91高清视频在线| 成人福利视频在线| 成人在线电影在线观看视频| 欧美videosex性极品hd| 一本色道久久亚洲综合精品蜜桃| 99一区二区三区| 日韩在线观看你懂的| 亚洲国产日韩av| 国产剧情一区二区三区| 精品久久久久久久久久久aⅴ| 很黄的网站在线观看| 日本成人中文字幕在线| 国产日韩亚洲精品| 欧美成人精品一区| 欧美精品久久天天躁| 久久久五月婷婷| 99视频一区| 亚洲妇女av| 成人免费直播| 久草在现在线| 欧美视频免费播放| 极品尤物一区二区三区| 欧美国产日韩一区二区在线观看 | 深夜福利国产精品| 精品国产999| 成人免费视频一区| 国产精品二区影院| 精品深夜福利视频| 麻豆成全视频免费观看在线看| 视频免费在线看| 成人免费视频91| 99re国产视频| 国内外成人免费激情在线视频| 亚洲国产精品热久久| 欧美性猛交xxxx乱大交| 中文av字幕一区|