一個bash解決方案
#!/bin/bash
while IFS= read -r line1; do
while IFS= read -r line2; do
printf "C: %s %s\n" "$line2" "${line1/#F: }"
done < file2
done < file1
這會遍歷file1
,並在file2
file1
循環的每一行。 printf
行彙編輸出,並且line
的參數擴展刪除了前導F:
。
結果:
C: server1 24000 user1 password1
C: server2 24000 user1 password1
C: server3 24000 user1 password1
C: server4 24000 user1 password1
C: server1 24000 user2 password2
C: server2 24000 user2 password2
C: server3 24000 user2 password2
C: server4 24000 user2 password2
C: server1 24000 user3 password3
C: server2 24000 user3 password3
C: server3 24000 user3 password3
C: server4 24000 user3 password3
一個解決方案加入和sed
這會工作,以及:
join -j 50 -o 2.1,1.1 -t '~' file1 file2 | sed s'/~F:/ /;s/^/C: /'
這是join
輕微的虐待。-j 50
說加盟匹配場數50,不存在因此被認爲等於對所有線路,導致這兩個文件的笛卡爾乘積:
$ join -j 50 file1 file2
F: user1 password1 server1 24000
F: user1 password1 server2 24000
F: user1 password1 server3 24000
F: user1 password1 server4 24000
F: user2 password2 server1 24000
F: user2 password2 server2 24000
F: user2 password2 server3 24000
F: user2 password2 server4 24000
F: user3 password3 server1 24000
F: user3 password3 server2 24000
F: user3 password3 server3 24000
F: user3 password3 server4 24000
要得到線成正確的順序,我們用-o 2.1,1,1
指定輸出格式。因爲默認的字段分隔符是空白,我們規定不與-t '~'
包含在輸入作爲新的分隔符字符:
$ join -j 50 -o 2.1,1.1 -t '~' file1 file2
server1 24000~F: user1 password1
server2 24000~F: user1 password1
server3 24000~F: user1 password1
server4 24000~F: user1 password1
server1 24000~F: user2 password2
server2 24000~F: user2 password2
server3 24000~F: user2 password2
server4 24000~F: user2 password2
server1 24000~F: user3 password3
server2 24000~F: user3 password3
server3 24000~F: user3 password3
server4 24000~F: user3 password3
最後,我們每行一個空格替換~F:
和使用SED前面加上C:
:
$ join -j 50 -o 2.1,1.1 -t '~' file1 file2 | sed 's/~F:/ /;s/^/C: /'
C: server1 24000 user1 password1
C: server2 24000 user1 password1
C: server3 24000 user1 password1
C: server4 24000 user1 password1
C: server1 24000 user2 password2
C: server2 24000 user2 password2
C: server3 24000 user2 password2
C: server4 24000 user2 password2
C: server1 24000 user3 password3
C: server2 24000 user3 password3
C: server3 24000 user3 password3
C: server4 24000 user3 password3
如果行的順序並不重要,這可以稍微縮短到
$ join -j 50 file2 file1 | sed 's/F://;s/^/C:/'
C: server1 24000 user1 password1
C: server1 24000 user2 password2
C: server1 24000 user3 password3
C: server2 24000 user1 password1
C: server2 24000 user2 password2
C: server2 24000 user3 password3
C: server3 24000 user1 password1
C: server3 24000 user2 password2
C: server3 24000 user3 password3
C: server4 24000 user1 password1
C: server4 24000 user2 password2
C: server4 24000 user3 password3
我刪除了'批處理文件'標記,因爲它不適用於你的問題。它指的是在MS-DOS,Windows或OS-2操作系統的特定上下文中的批處理文件。請不要僅僅因爲它們包含類似的聲音名稱或短語而使用標籤。這裏的標籤有特定的含義。如果您不確定,請閱讀標籤的說明。如果你還不確定,請不要使用它;如果有必要,有人會爲你添加它。 –
您是否必須在BASH中執行此操作,或者可以使用Python或AWK之類的操作? – pkacprzak
@pkacprzak在Python中是可以接受的!謝謝 !我將在Linux中添加'Python'標籤 – Hackoo