一致する場合は、2つのファイルの最初の列を比較します。日付変数を更新し、そうでない場合は行を2番目のファイルに追加します。

一致する場合は、2つのファイルの最初の列を比較します。日付変数を更新し、そうでない場合は行を2番目のファイルに追加します。

だから、次の2つのファイルがあります。

ファイル1

userName | cpu% | command | date created

    user1 101.6 plasma-de+ Thu Aug  8 09:30:17 MDT 2019
    user2 100.0 plasma-de+ Thu Aug  8 09:30:17 MDT 2019
    user3 102.0 plasma-de+ Thu Aug  8 09:30:17 MDT 2019

ファイル2

userName | cpu% | command | date created | date updated

    user1 101.6 plasma-de+ Mon Aug  5 06:35:39 MDT 2019    Mon Aug  5 06:35:39 MDT 2019 
    user2 100.0 plasma-de+ Mon Aug  5 06:35:39 MDT 2019    Mon Aug  5 06:35:39 MDT 2019 

file2 コマンド実行後

userName | cpu% | command | date created | date updated

    user1 101.6 plasma-de+ Mon Aug  5 06:35:39 MDT 2019    Thu Aug  8 09:30:17 MDT 2019
    user2 100.0 plasma-de+ Mon Aug  5 06:35:39 MDT 2019    Thu Aug  8 09:30:17 MDT 2019
    user3 102.0 plasma-de+ Thu Aug  8 09:30:17 MDT 2019    Thu Aug  8 09:30:17 MDT 2019

file1のcol1をインポートしたい場合、file2のcol1に一致するものがある場合は、最後の列の「更新日」を更新してください。一致するものがない場合は、file1の行全体をfile2に追加し、その行に「更新された日付」値を追加したいと思います。

現在awk 'NR==FNR{c[$1]++;next};c[$1] > 0' file2 file1、基準比較を使用しているが一致するものがある場合、行全体が誤って印刷され、日付列を更新するために別の条件を追加する方法がわかりません。私もシェルスクリプトでこれを試しました。

ベストアンサー1

$ cat tst.awk
BEGIN { OFS="    " }
NR==FNR {
    if (NR > 2) {
        user = $1
        file1[user] = $0
        sub(/^[[:space:]]*([^[:space:]]+[[:space:]]+){3}/,"")
        date[user] = $0
    }
    next
}
$1 in file1 {
    sub(/([[:space:]]+[^[:space:]]+){6}[[:space:]]*$/,"")
    $0 = $0 OFS date[$1]
    delete file1[$1]
}
{ print }
END {
    for (user in file1) {
        print file1[user] OFS date[user]
    }

$ awk -f tst.awk file1 file2
userName | cpu% | command | date created | date updated

    user1 101.6 plasma-de+ Mon Aug  5 06:35:39 MDT 2019    Thu Aug  8 09:30:17 MDT 2019
    user2 100.0 plasma-de+ Mon Aug  5 06:35:39 MDT 2019    Thu Aug  8 09:30:17 MDT 2019
    user3 102.0 plasma-de+ Thu Aug  8 09:30:17 MDT 2019    Thu Aug  8 09:30:17 MDT 2019

おすすめ記事