簡體   English   中英

格式化粘貼兩個文本文件,通過bash / sed / awk在其中一個中添加給定數量的空行

[英]formatted paste two text files adding a given number of empty lines in one of them via bash/sed/awk

我有兩個文本文件A.txt (長度N)和B.txt (長度N * n,其中n是塊長度),其結構如下

A.txt

Line 1 
Line 2 
Line 3
...
Line N

B.txt

Block1 (line 1)
Block1 (line 2)
Block1 (line 3)
...
Block1 (line n)
Block2
...
... 
BlockN

我想合並兩個文件,並遵循某種格式,以使A.txt中的第i行插入B.txt中相應的第i塊之前:

Line1 #from A.txt 
Block1 (line 1) #from B.txt
Block1 (line 2) 
Block1 (line 3)
...
Block1 (line n)
Line2 #from A.txt 
Block2 #from B.txt
...
... 
LineN #from A.txt 
BlockN #from B.txt

在bash中,最好的方法是將(n-1)個空行添加到A.txt ,然后使用paste命令,然后使用awk來管理所有行的格式化打印。

但是,我面臨兩個困難:

  • 定義(帶有bash循環)由(n-1)個空行組成的字符串
  • 將字符串變量傳遞給awk以進行printf

這是一個可能的示例(N = 2,n = 3):

A.txt

10  2.3
20  0.653

B.txt

A x 2.5 3 6.1
B x 1.0 2.5 4
C x 1 1 0.52
A x 1.5 2 2.5
B x 2 3 1
C x 2.01 3.0 1.0

它應該產生結果(格式要求可能還需要從B.txt清除一些列):

10    2.300
A   2.5 3.0 6.1
B   1.0 2.5 4.0
C   1.0 1.0 0.5
20    0.653
A   1.5 2.0 2.5
B   2.0 3.0 1.0
C   2.0 3.0 1.0

這是n = 3且N = 4的解決方案n值通過-v傳遞給awk:

$ cat a.txt
A1
A2
A3
A4

$ cat b.txt
b11
b12
b13
b21
b22
b23
b31
b32
b33
b41
b42
b43

$ awk -v n=3 'NR==FNR {a[NR]=$0; next} FNR % n == 1 {print a[++i]}1' a.txt b.txt
A1
b11
b12
b13
A2
b21
b22
b23
A3
b31
b32
b33
A4
b41
b42
b43

說明

awk -v n=3

調用awk,傳入設置為值3的n變量

NR==FNR {a[NR]=$0; next}

NR等於FNR這意味着我們正在從第一個文件a.txt中讀取(因為總記錄號NR與文件FNR的記錄號相同)。

關聯的操作將a.txt所有行保存到數組a ,每行均由其行號索引。

next語句將跳過所有進一步的處理,並立即去嘗試讀取下一行a.txt

FNR % n == 1 {print a[++i]}

當我們到達這里時,我們知道我們正在讀取第二個文件b.txt (從關於NR==FNR和上面的next b.txt語句的閱讀中可以清楚看出這一點)。

我們將mod函數與傳入的塊大小一起使用,以測試b.txt的當前行是否為塊的第一行。 (如果塊大小為3,例如,我們知道第1、4、7,...行開始該塊。)

如果我們位於一個塊的開頭,則從包含a.txt中的行a數組中打印下一行。 遞增的索引i確保從a.txtt始終在b.txtt之前打印。

1

1是awk慣用語,表示要打印當前行。 Awk由一組模式和操作組成。 這里的1是評估為true的模式。 由於沒有給出明確的操作,因此將調用默認操作,該操作將打印當前行。 代替1 ,我們可以放{print} ,例如

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM