일치하는 경우 두 파일의 첫 번째 열을 비교합니다. 날짜 변수를 업데이트하고, 그렇지 않으면 행을 두 번째 파일에 추가합니다.

일치하는 경우 두 파일의 첫 번째 열을 비교합니다. 날짜 변수를 업데이트하고, 그렇지 않으면 행을 두 번째 파일에 추가합니다.

그래서 다음과 같은 두 개의 파일이 있습니다.

파일 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

관련 정보