![](/img/trans.png)
[英]Return the number of lines required for paragraphs of text for a given width in Bash
[英]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
來管理所有行的格式化打印。
但是,我面臨兩個困難:
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.txt
行t
始終在b.txt
塊t
之前打印。
1
1
是awk慣用語,表示要打印當前行。 Awk由一組模式和操作組成。 這里的1
是評估為true的模式。 由於沒有給出明確的操作,因此將調用默認操作,該操作將打印當前行。 代替1
,我們可以放{print}
,例如
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.