linux中檔案多行合併為一行的例子

2022-05-28 15:09:12 字數 1200 閱讀 1172

現網中經常遇到匹配到某一關鍵字下的所有行合併到同一行,再次匹配到相關關鍵字再和下面的合併,示例如下:

# line1ab

# line2cd

e# line3

f想要變成:

# line1 a b

# line2 c d e

# line3 f

即:把某個"# line"打頭與下乙個"#line"打頭之間的行合成一行(這一行包括#line),但兩個#line之間的行數是不確定的。

以下是發動群眾從群裡得到的解決方法(分別為sed和awk實現):

# sed實現方法

# sed -n '/#/;s/\n//;$p;ta}' file

# sed ':a;$!n;/\n#$/!s/\n//;ta;s/#/\n#/g'  file

# sed -n '1h;/#/!;1!' file

# awk實現方法

# awk ''  file

# awk '/^#10/'  file

# awk 'begin;else}'  file

個人還是偏向於使用awk 方法,而且理解上也比較容易理解,sed方法理解起來感覺想當費勁。

現網需求如下:通過bmc自動化採集工具,採到當前現網某機房掛載某nas儲存的所有主機。通過grep匹配nas機頭ip,有結果輸出的證明有掛載,無輸出的表明當前未掛載該nas,輸出類似如下圖

由於該機房有上千臺左右的主機,輸出結果還是比較多的。所以想將每台主機的結果主機名等合併到同一行,並通過二次匹配獲取所有掛載的主機,這樣比較方便匯入excel中展示出來。

# awk '/^10/' caiji.txt |awk '}'

由於所有ip都是以10開頭的,這裡先正則匹配所有10開頭的行,如果匹配不上的,通過printf列印並繼續向下匹配,匹配上的通過print實現換行。後面的二次匹配就不解釋了,比較簡單。

注:printf 與 print的區別是printf列印的時候是不會換行的,print列印後,預設是帶有\n換行的。如果只列印一行的話,printf + \n = print。

應用:將registry中列根據指定分隔符轉成行,過濾掉不要,再將多行按照指定分隔符合併成一列。

cat registry|awk -f "endelse}'

SQLserver 多行合併為一行

將表和插入模擬資料 create table test id int course varchar 255 insert into test values 1,語文 insert into test values 2,數學 insert into test values 3,英語 insert in...

MySQL多行結果合併為一行

在做乙個專案的使用者列表的時候,需要將乙個使用者的多輛車放在一行顯示,但是普通查詢出來的結果是 array 0 array id 29 user id 1 car no 234567 1 array id 21 user id 1 car no 23565 2 array id 23 user id...

sqlserver字串多行合併為一行

建立測試表 ifobject id test is notnull drop table test create table dbo.test id intidentity 1,1 not null name varchar 50 null subject varchar 50 null sourc...