Cat

按兩個不同名稱列表的特定順序合併文件

  • November 19, 2019

在一個文件夾中,我有兩組 6 個文件:

第一組:

1st-letter-00 - 1st-letter-05

第二組:

verse-00 - verse-05

如何連接這兩組,以使結果是一個文件,其中包含從上到下的所有文件,如下所示:

Content of 1st-letter-00
Content of verse-00
Content of 1st-letter-01
Content of verse-01
etc.

我希望這個問題很清楚。

此答案中有兩個解決方案:

  1. 循環遍歷一組中的文件並構造另一組中的文件名,並且
  2. 循環數字並在循環中構造兩個文件名。

將一組文件與另一組文件配對的一種方法是循環其中一組文件並從中構造另一組文件的文件名。這在您可能不確切知道文件名後綴可能是什麼或一組中有多少文件但希望將一組中的任何文件與另一組中的文件匹配的情況下很有用。

for verse in verse-*; do
   letter1=1st-letter-${verse#verse-}

   cat "$letter1" "$verse"
done >result.txt

… 要不就

for verse in verse-*; do cat "1st-letter-${verse#verse-}" "$verse"; done >result.txt

這將遍歷目前目錄中以 string 開頭的所有名稱verse-。這將包括您的所有verse-00verse-01文件。如果您想確保只匹配前六個(或者如果您有其他具有相同文件名前綴的文件),請使用模式verse-0[0-5]而不是verse-*.

在每次迭代中,通過從目前值中刪除前綴並在其前面加上字元串1st-letter來構造相應文件的名稱。然後將兩個文件連接起來。verse-``$verse``1st-letter-

整個循環的輸出被寫入result.txt.

測試:

$ ls -l
total 48
-rw-r--r--  1 kk  wheel  26 Nov 19 11:48 1st-letter-00
-rw-r--r--  1 kk  wheel  26 Nov 19 11:48 1st-letter-01
-rw-r--r--  1 kk  wheel  26 Nov 19 11:48 1st-letter-02
-rw-r--r--  1 kk  wheel  26 Nov 19 11:48 1st-letter-03
-rw-r--r--  1 kk  wheel  26 Nov 19 11:48 1st-letter-04
-rw-r--r--  1 kk  wheel  26 Nov 19 11:48 1st-letter-05
-rw-r--r--  1 kk  wheel  21 Nov 19 11:48 verse-00
-rw-r--r--  1 kk  wheel  21 Nov 19 11:48 verse-01
-rw-r--r--  1 kk  wheel  21 Nov 19 11:48 verse-02
-rw-r--r--  1 kk  wheel  21 Nov 19 11:48 verse-03
-rw-r--r--  1 kk  wheel  21 Nov 19 11:48 verse-04
-rw-r--r--  1 kk  wheel  21 Nov 19 11:48 verse-05

上面的循環在這裡執行。

$ cat result.txt
Contents of 1st-letter-00
Contents of verse-00
Contents of 1st-letter-01
Contents of verse-01
Contents of 1st-letter-02
Contents of verse-02
Contents of 1st-letter-03
Contents of verse-03
Contents of 1st-letter-04
Contents of verse-04
Contents of 1st-letter-05
Contents of verse-05

使用不太舊的版本bash(macOS 上的預設值bash太舊)或使用zshor yash,您還可以循環使用您想要使用的特定零填充數字,在循環中構造兩個文件名:

for num in {00..05}; do
   cat "1st-letter-$num" "verse-$num"
done >result.txt

使用舊版本bash(在大括號擴展中不使用零填充整數),您可以使用

for num in 0{0..5}; do
   cat "1st-letter-$num" "verse-$num"
done >result.txt

…並且要包含數字9,您可以使用

for num in 0{0..9} {10..99}; do
   cat "1st-letter-$num" "verse-$num"
done >result.txt

這將涵蓋到 的00數字99

引用自:https://unix.stackexchange.com/questions/552901