精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何把awk腳本移植到Python

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

[[285020]]

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

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

何時從 awk 轉向 Python

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

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

在將 awk 腳本移植到 Python 之前,通常值得考慮一下其原始使用場景。例如,由于 awk 的局限性,通常從 Bash 腳本調用 awk 代碼,其中包括一些對 sedsort 之類的其它命令行常見工具的調用。 最好將所有內容轉換為一個一致的 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 行為

如果 FNRNR 和行數這三個你全都需要,仍然會有一些問題。如果確實如此,則使用三元組(其中兩個項目是數字)會導致混淆。命名參數可使該代碼更易于閱讀,因此最好使用 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(":")

這種拆分非常適合用來處理參數,但是我們處于偏差一個的錯誤場景中。現在 parts[0] 將對應于 awk 的 $1parts[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

2011-03-17 17:36:01

iptables嵌入式Linux

2010-09-27 16:26:09

JVMarm

2012-05-18 20:30:19

微軟 Android ap

2011-05-12 13:48:07

MySql數據庫本地移植

2011-05-04 09:29:22

2015-05-05 10:16:17

AndroidWindows

2023-06-07 09:00:00

JavaScript開發TypeScript

2010-08-12 10:43:36

DB2 SQL移植

2020-10-19 10:28:58

liteos-a移植STM32MP157

2016-08-10 16:07:08

awkLinux開源

2022-11-09 10:33:39

awk腳本Groovy

2021-06-27 17:40:49

安全DevOpsDevSecOps

2016-08-11 09:18:33

awkShellLinux

2011-08-05 10:40:54

2011-01-13 14:19:41

solarisLinux

2016-07-29 15:13:00

awk文本處理工具編程

2013-02-21 14:08:18

TizenTizen image

2009-10-10 13:54:20

OPhone
點贊
收藏

51CTO技術棧公眾號

精品视频一区三区九区| 亚洲国产经典视频| 欧亚精品在线观看| 美女av免费看| 91成人精品在线| 狠狠躁夜夜躁人人爽天天天天97| 午夜精品一区二区在线观看| 国内精品久久久久久久久久| 亚洲一区不卡| 日韩午夜在线视频| 大乳护士喂奶hd| 国产成人精品一区二区三区免费 | 欧美精品一区二区三区很污很色的 | www.欧美com| 台湾佬中文娱乐久久久| 一区二区三区在线高清| 日韩高清av| 免费观看国产精品| 国产真实乱子伦精品视频| 欧美一级电影免费在线观看| 唐朝av高清盛宴| 成人3d精品动漫精品一二三| 亚洲成av人影院在线观看| jizzzz日本| 一二三四视频在线中文| 一区二区三区四区亚洲| 亚洲春色在线| 亚洲av成人精品日韩在线播放| 国产一区二区视频在线播放| 国产精品wwww| 黄色片免费观看视频| 合欧美一区二区三区| 日韩中文字幕亚洲| 国产免费一区二区三区网站免费| 一区二区三区四区高清视频| 欧美精品亚洲一区二区在线播放| 免费无码av片在线观看| 精灵使的剑舞无删减版在线观看| 国产精品国产自产拍高清av| 欧美久久久久久久| 天天操天天射天天| 国产成人精品免费看| 国产色视频一区| 真实的国产乱xxxx在线91| 亚洲久久成人| 6080yy精品一区二区三区| 久久午夜无码鲁丝片| 亚洲成人三区| 久久夜色精品国产亚洲aⅴ| 国产免费看av| 色综合www| 亚洲精品在线观看www| 三级视频网站在线观看| 成人三级av在线| 精品成人私密视频| 无码人妻aⅴ一区二区三区玉蒲团| 日本亚洲欧洲无免费码在线| 欧美日韩三级一区二区| 91欧美视频在线| 青青在线精品| 91麻豆精品国产91久久久 | 国产在线播精品第三| xxxx欧美18另类的高清| 手机免费看av| 成人午夜国产| 精品国产一区二区三区久久狼黑人 | 亚洲精品自拍视频| 亚洲一区二区三区无码久久| 日本三级久久| 国产亚洲欧美日韩美女| 国产黄色录像视频| 亚洲精品成人无限看| 欧美理论电影在线播放| 久青草免费视频| a91a精品视频在线观看| 日韩美女免费观看| 中文字幕在线2019| 国产乱子轮精品视频| 国产乱码精品一区二区三区日韩精品 | 精品欧美一区二区三区精品久久| 91成人在线观看喷潮蘑菇| 高清精品xnxxcom| 亚洲女人初尝黑人巨大| 欧美88888| 欧美日韩国产欧| 欧美资源在线观看| 国产又粗又黄又爽的视频| 国产精品2024| 欧美一区二区三区在线播放| 日本最新在线视频| 午夜影院在线观看欧美| 手机看片福利日韩| 538任你躁精品视频网免费| 日韩精品视频在线观看免费| 中文字幕伦理片| 欧美涩涩视频| 国产精品欧美日韩一区二区| 国产黄a三级三级看三级| 91亚洲大成网污www| 亚洲免费不卡| 国产美女高潮在线| 欧美中文字幕一区二区三区亚洲 | 香蕉影院在线观看| 激情综合色播激情啊| 激情视频在线观看一区二区三区| 成人高清免费观看mv| 亚洲最大的成人av| 亚洲免费av一区二区三区| 中文字幕日韩高清在线| 综合国产在线视频| 日韩久久久久久久久| 麻豆中文一区二区| 免费在线一区二区| 日本在线视频网址| 欧美日韩大陆在线| 中文字幕xxx| 欧美欧美全黄| 国产日韩精品入口| 国产毛片在线| 天天操天天综合网| 蜜桃视频无码区在线观看| 成人综合久久| 青草青草久热精品视频在线网站| 国产黄a三级三级看三级| 国产精品丝袜一区| 激情五月婷婷久久| 国产精品x8x8一区二区| 欧美成人精品不卡视频在线观看| 中文字幕+乱码+中文乱码91| 91视频免费看| heyzo国产| 超碰在线亚洲| 欧美国产日韩一区二区| 国产三级三级在线观看| 国产精品初高中害羞小美女文| 97在线免费公开视频| 黄色免费大全亚洲| 国语自产精品视频在线看抢先版图片| 国产伦理吴梦梦伦理| 中文av一区二区| 国产免费999| 国产亚洲一区二区三区不卡| 51色欧美片视频在线观看| 人妻视频一区二区三区| 亚洲精品免费在线| 日本成人xxx| 欧美成人日韩| 99re资源| 超免费在线视频| 精品福利一二区| 国产乡下妇女做爰| 9l国产精品久久久久麻豆| 久久久久久免费看| 日韩av黄色在线| 欧美在线中文字幕| 欧美成人片在线| 91国产免费看| 精品日韩在线视频| 精彩视频一区二区三区| 二级片在线观看| 欧美视频精品全部免费观看| 久久国产精品久久精品| 成人高潮片免费视频| 亚洲国产精品一区二区尤物区| 欧美xxxx×黑人性爽| 老司机精品视频网站| 日韩精品第一页| 婷婷久久综合九色综合99蜜桃| 日韩中文字幕网址| 国产999久久久| 五月婷婷综合激情| 人妻少妇无码精品视频区| 日本女人一区二区三区| 国产卡一卡二在线| 精品福利网址导航| 国产精品高潮呻吟视频| 麻豆系列在线观看| 欧美精品一区二区三区在线| 天堂网中文字幕| 中文字幕亚洲欧美在线不卡| 色哟哟在线观看视频| 一本一本久久| 亚洲一区二区三区涩| 在线观看视频一区二区三区| 欧美在线一级va免费观看| √新版天堂资源在线资源| 欧美一区二区三区色| 中国一级免费毛片| 中文字幕一区二区在线观看 | 久久久午夜电影| 91热视频在线观看| 99香蕉国产精品偷在线观看| 水蜜桃亚洲一二三四在线| 日韩亚洲精品在线观看| 日本一区二区在线播放| 91精品国产91久久久久久青草| 亚洲加勒比久久88色综合| 久久这里只有精品9| 亚洲在线免费播放| 欧美激情视频二区| 成人h精品动漫一区二区三区| 天天干在线影院| 亚洲成色精品| 国产日本欧美在线| 九一成人免费视频| 国产精品福利视频| 2020国产精品小视频| 欧美一级在线亚洲天堂| 在线h片观看| 亚洲一区二区黄| 欧美 日韩 国产 精品| 欧美精品丝袜中出| 日韩一级在线视频| 午夜视频一区在线观看| 中国毛片直接看| 国产午夜精品在线观看| av电影在线播放| 韩国精品一区二区| 992kp快乐看片永久免费网址| 亚洲福利久久| 一本色道久久88亚洲精品综合| 欧美艳星介绍134位艳星| 精品欧美日韩| y111111国产精品久久久| 91久久久久久久久久久| www.精品国产| 国产91九色视频| 理论不卡电影大全神| 欧美精品激情blacked18| 三区四区电影在线观看| 在线电影av不卡网址| 男人的天堂在线| 日韩精品一区二区三区第95| 免费国产羞羞网站视频| 欧美mv日韩mv| 亚洲国产精品久久久久久久| 欧美一区二区精品| 国产人妻精品一区二区三区| 欧美人与z0zoxxxx视频| 亚洲自拍第二页| 欧美日韩的一区二区| 影音先锋黄色网址| 欧美日韩视频专区在线播放| 综合久久中文字幕| 精品视频一区 二区 三区| 在线视频 中文字幕| 欧美午夜宅男影院| 这里只有久久精品视频| 精品视频在线免费观看| 一级黄色片在线看| 69堂亚洲精品首页| av在线亚洲天堂| 精品国产欧美一区二区| 少妇一级淫片免费看| 亚洲精品久久久久久久久久久久久| 三级小视频在线观看| 日韩av网址在线| 邻居大乳一区二区三区| 在线视频免费一区二区| av在线电影播放| 久久精品国产欧美亚洲人人爽| 五月天婷婷在线视频| 久久国产精品久久久久久| hd国产人妖ts另类视频| 日本电影亚洲天堂| 国产精品毛片久久久久久久久久99999999| 国产精品露脸av在线| 欧美aaa级| 91在线在线观看| 美国成人xxx| 欧美在线一区二区三区四区| 首页国产精品| 激情小视频网站| 欧美综合二区| 国产高清999| gogo大胆日本视频一区| 在线观看国产精品一区| 亚洲图片你懂的| 在线观看国产亚洲| 欧美猛男gaygay网站| 亚洲第一天堂在线观看| 亚洲免费小视频| 男人的天堂在线视频免费观看| 欧美大片在线看免费观看| rebdb初裸写真在线观看| 国产精品久久色| 亚洲精品一区二区三区在线| 欧美xxxx黑人又粗又长密月| 午夜欧美在线| 国产日产欧美视频| 国产呦萝稀缺另类资源| 国产激情第一页| 中文字幕中文字幕在线一区| 日本三级一区二区| 欧美在线色视频| 色婷婷视频在线| 日韩在线观看视频免费| 九九精品调教| 国产精品美女视频网站| 成人性生交大片免费看96| 亚洲三区在线| 亚洲综合日韩| 91亚洲一线产区二线产区| 国产精品久久久久四虎| 国产精品一区二区6| 91精品国产福利在线观看| 国产在线黄色| 国内精品一区二区三区四区| 成人污污视频| 日韩欧美亚洲区| 99在线观看免费视频精品观看| 亚洲一二三av| 国产日韩欧美电影| 青青国产在线观看| 这里只有精品电影| 不卡在线视频| 日本午夜精品理论片a级appf发布| jazzjazz国产精品麻豆| 日本一区二区免费高清视频| 视频在线观看一区二区三区| 久久久久亚洲AV成人无码国产| 亚洲美女视频一区| 国产精品久久久久毛片| 国产亚洲欧美日韩美女| 中文字幕乱码中文乱码51精品| 国产高清精品一区二区| 综合av在线| 一二三级黄色片| 欧美国产日产图区| 亚洲第一网站在线观看| 亚洲国产精品99久久| 激情av在线| 99久久精品久久久久久ai换脸| 91精品国产乱码久久久久久久| 久久人人爽av| 国产精品国产三级国产普通话三级| 欧美人一级淫片a免费播放| 精品网站999www| 周于希免费高清在线观看| 久久久久一区二区| 亚洲精品日韩久久| 国产一线在线观看| 亚洲一区二区三区自拍| 亚洲美女福利视频| 欧美大片网站在线观看| 成人偷拍自拍| 精品无码一区二区三区在线| 成人av在线电影| 影音先锋亚洲天堂| 亚洲免费一在线| 影音成人av| 亚洲欧美在线网| 韩国女主播成人在线观看| 欧美丰满艳妇bbwbbw| 欧美电视剧在线看免费| 91禁在线看| 欧美连裤袜在线视频| 奇米一区二区三区| 成人涩涩小片视频日本| 精品少妇一区二区三区免费观看 | 亚洲va久久久噜噜噜久久天堂| 97精品国产| 一级黄色大片免费看| 午夜精品久久久久久久99水蜜桃| 四虎精品在线| 国产精品视频yy9099| 中文字幕一区二区三区乱码图片| 色哟哟在线观看视频| 精品久久久久久久久久久久| 国产永久免费高清在线观看视频| 国产精品日韩专区| 亚洲深深色噜噜狠狠爱网站| 国模无码视频一区| 色综合久久久久网| 精品视频在线一区二区| 国产成人看片| 日日欢夜夜爽一区| 久久中文免费视频| 亚洲精品久久在线| 欧美大片网站| 免费看黄在线看| 国产精品色婷婷久久58| 成人小说亚洲一区二区三区 | 日本高清不卡码| 日韩视频一区在线| 美女一区二区在线观看| 最新中文字幕2018| 亚洲国产综合色| 香蕉视频网站在线观看| 国产精品区一区二区三含羞草| 久久永久免费| 久久久久久久极品内射| 一区二区欧美久久| 国产成人澳门| 五月婷婷六月丁香激情| 亚洲成av人影院在线观看网| 色老头视频在线观看| 女同一区二区| 成人激情小说网站| 亚洲熟女乱色一区二区三区久久久 |