日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

文本替换sed+字段处理cut,join+awk重新编排字段

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文本替换sed+字段处理cut,join+awk重新编排字段 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【1】sed工具(Stream Editor)——流編輯器

sed 本身也是一個管線(管道)命令,可以分析 standard input 的啦! 而且 sed 還可以將數據進行取代、刪除、新增、截取特定行等等的功能呢!

1.1)以行為單位的新增/刪除功能

【玩玩荔枝呢】

【輸出不是輸出是 刪除,刪除】

1.2)以行為單位的取代與顯示功能


1.3) 部分數據的搜索并取代的功能(g=global)


【Attention】上表中特殊字體的部分為關鍵詞,請記下來!至于三個斜線分成兩欄就是新舊字符串的替換啦!

荔枝要求

假設我只要 MAN 存在的那幾行數據, 但是含有 # 在內的批注我不想要,而且空白行我也不要!此時該如何處理呢?

1.4)直接修改檔案內容(危險動作)

sed 甚至可以直接修改檔案的內容呢!

【玩玩荔枝吧】


【Declaration】 以下內容總結于shell腳本學習指南

【1】sed——stream editor 流編輯器


貼一張鳥哥的圖片

1.1)替換細節——s命令里以g結尾表示: glocal 全局



1.2)sed的運作

sed 讀取每個文件,一次讀一行,將讀取的行放到內存的一個區域——稱為模式空間。


1.3) 你還記得head嗎?

head N file count=$1 sed ${count}q "$2" # $1=N, $2=file

1.4) 說替換

范圍:可指定行的范圍,以逗點隔開

sed -n '10,20p' hadoop.sh 只打印10~20行sed -n '/export/,/export/ s/word1/word2/g' 在export和export之間的行,用word2全局替換word1 sed -n '/tang/ !s/am/AM/g' tang.txt 在沒有tang的行用AM替換am;


1.5)有多少文本會改動

和有多少愛可以重來是一樣的?呵呵了?
有多少文本會匹配 + 從哪兒開始匹配?

【Answers】:

正則表達式可以匹配整個表達式輸入文本中最長的,最左邊的子字符串。除此之外,匹配的空null字符串,則被認為是比完全不匹配的還長。
如ab*c , 匹配ac, 而b* 成功匹配a c 間的null字符串。
by the way, POSIX指出:完全一致的匹配,指的是最左邊開始匹配,針對每一子模式, 由左向右,必須匹配最長的可能字符串。
(子模式指的是在ERE下圓括號的部分)

【看個荔枝,you should got it】

【2】字段處理

2.1)cut剪切文本

cut -c 以字符為主 做剪切操作 (startup 1) cut -d 設置分隔符 cut -f 以字段為主 進行剪切操作 (startup 1)

【荔枝時間到】


2.2)join連接文本

主要選項

  • -1 field1 表明要結合 的 字段
  • -2 field2 表明要結合 的 字段
  • -o file.field 輸出file的field字段,其他字段不打印
  • -t seperator 分隔符


【3】使用awk重新編排字段

(以下內容轉自鳥哥)

awk 主要是處理『每一行的字段內的數據』,而默認的『字段的分隔符為 “空格鍵” 或  “[tab]鍵” 』!

【Attention】注意awk的處理格式。

【相關說明】

以上面的例子來說, root 是 1192.168.1.1003 啦!后面以此類推~呵呵!還有個變數喔!那就是 00 代表『一整行資料』的意思~以上面的例子來說,第一行的 $0 代表的就是『root …. 』那一行啊!

3.1)awk的處理流程:

  • 讀入第一行,并將第一行的資料填入 0,1, $2…. 等變數當中;
  • 依據 “條件類型” 的限制,判斷是否需要進行后面的 “動作”;
  • 做完所有的動作與條件類型;
  • 若還有后續的『行』的數據,則重復上面 1~3 的步驟,直到所有的數據都讀完為止。
    經過這樣的步驟,你會曉得, awk 是『以行為一次處理的單位』, 而『以字段為最小的處理單位』。
  • 3.2)那么 awk 怎么知道我到底這個數據有幾行?

    有幾欄呢?這就需要 awk 的內建變量的幫忙啦~

    【荔枝時間到】

    列出每一行的賬號(就是 $1); ? 列出目前處理的行數(就是 awk 內的 NR 變量) ? 并且說明,該行有多少字段(就是 awk 內的 NF 變量)


    【Attention】

    要注意喔,awk 后續的所有動作是以單引號『 ’ 』括住的,由于單引號和雙引號都必須是成對的, 所以, awk 的格式內容如果想要以 print 打印時,記得非變量的文字部分,包含上一小節 printf 提到的格式中,都需要使用雙引號來定義出來喔(單引號里面內嵌雙引號)!因為單引號已經是 awk 的指令固定用法了!

    【Attention】

    注意喔,在 awk 內的 NR, NF 等變量要用大寫,且不需要用錢字號 $ 啦!

    【Complementary】

    awk的print 語句會自動換行,就想C中的printf語句類似;
    但是如果換做用printf來格式化打印字符串的話,就要通過\n轉義序列的使用來進行換行功能。

    3.3)awk的邏輯運算符號;

    值得注意的是那個『 == 』的符號,因為:
    ? 邏輯運算上面亦即所謂的大于、小于、等于等判斷式上面,習慣上是以『 == 』來表示;
    ? 如果是直接給予一個值,例如變量設定時,就直接使用 = 而已(=賦值變量符號)。

    【荔枝又來了】

    好了,我們實際來運用一下邏輯判斷吧!舉例來說,在 /etc/passwd 當中是以冒號 “:” 來作為字段的分隔, 該檔案中第一字段為賬號,第三字段則是 UID。那假設我要查閱,第三欄小于 10 以下的數據,并且僅列出賬號和第三欄, 那么可以這樣做:

    Problem: 有趣吧!不過,怎么第一行沒有正確的顯示出來呢?
    Reason:這是因為我們讀入第一行的時候,那些變量  1,2… 默認還是以空格鍵為分隔的,所以雖然我們定義了 FS=”:” 了, 但是卻僅能在第二行后才開始生效。
    How to solve it ?那么怎么辦呢?我們可以預先設定 awk 的變量啊! 利用 BEGIN 這個關鍵詞喔!這樣做:
    (Attention:這里鳥哥要比shell腳本學習指南講的要好得多)

    3.4) Relative Specification:

    (1)awk的指令間隔:所有 awk 的動作,亦即在 {} 內的動作,如果有需要多個指令輔助時,可利用分號『;』間隔(這就是剛才為什么會報awk語法錯誤的原因,因為少加了一個分號[;]), 或者直接以 [Enter] 按鍵來隔開每個指令,例如上面的范例中,鳥哥共按了三次 [enter] 喔!
    (2)? 邏輯運算當中,如果是『等于』的情況,則務必使用兩個等號『==』!
    (3)? 格式化輸出時,在 printf 的格式設定當中,務必加上 \n ,才能進行分行! 不過要用雙引號吧\n包起來;
    (4)? 與 bash shell 的變量不同的是,在 awk 當中,變量是可以直接使用的,不需加上 $ 符號。
    【Note】以上的 說明很是重要,牢記。
    【print 與 printf 的 區別的例子】

    (簡單說就是print只能簡單的打印字段列表并自動換行,而printf不能提供自動換行,但是可以進行格式化打印 like C language)

    3.4) awk 的動作內 {} 也是支持 if (條件) 的喔!

    總結

    以上是生活随笔為你收集整理的文本替换sed+字段处理cut,join+awk重新编排字段的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。