Bash

如何使用 awk/sed 命令連接兩個文件中的列?

  • January 12, 2021

我有兩個文件 File-1 和 File-2,列中有數據。我想創建另一個文件並將與數據相對應的 File-2 的第一列的數據按行複製到 file-1,如下所示。

文件-1



A  P
B  Q
C  R

文件-2



5.4  9.0
7.4  11.5
9.4  15.7

輸出

A=5.4, B=7.4, C=9.4

我希望我的輸出像上面那樣僅用於第一列數據。

我感謝您的幫助!!

提前致謝!!!

$ paste file1 file2 | awk '{printf "%s%s=%s", sep, $1, $3; sep=", "} END{print ""}'
A=5.4, B=7.4, C=9.4

請注意,“連接”(在問題標題中提到)是一種特定操作,其中一個數據集用於從另一個數據集中提取數據(關係連接操作)。這可以通過join實用程序(或短awk命令)來完成。

您要做的是數據提取和合併。您在問題文本中對此進行了很好的解釋。

假設你有bashshell,每個文件的第一列的內容可以使用 提取cut,然後使用=作為分隔符合併paste

$ paste -d '=' <(cut -d ' ' -f 1 File-1) <(cut -d ' ' -f 1 File-2)
A=5.4
B=7.4
C=9.4

每個<(...)(程序替換)都將被替換為一個臨時文件的名稱,替換中的cut命令輸出將從該文​​件中可供paste讀取。

然後,您可以將其合併到一個逗號分隔的行中,如下所示:

$ paste -d '=' <(cut -d ' ' -f 1 File-1) <(cut -d ' ' -f 1 File-2) | paste -d ',' -s -
A=5.4,B=7.4,C=9.4

如果您需要每個逗號後的空格,sed可以使用:

$ paste -d '=' <(cut -d ' ' -f 1 File-1) <(cut -d ' ' -f 1 File-2) | paste -d ',' -s - | sed 's/,/, /g'
A=5.4, B=7.4, C=9.4

請注意,我假設問題中的空行實際上不是數據文件的一部分。您可能希望使用 預處理數據sed '/^[[:blank:]]*$/d',這將刪除任何空行或僅包含空格和/或製表符的行。

另請參閱cutpaste(man cutman paste) 的手冊。

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