使用 awk 重新排列相同的时间戳

问题描述 投票:0回答:2

我有几个文件。

猫<< EOF >文件1.txt

20190130150000 #timestamp-1
     56   39
  P                                         A
  S-4 B                               4.     E     F      3
 -9999 -9999      6.99       0.000 -9999 -9999
 -9999 -9999      9.99       0.000 -9999 -9999
 20190130151000 #timestamp-2
     56   39
  P                                         A
  S-4 B                               4.     E     F      3
 -9999 -9999     6.99       0.000 -9999 -9999
 -9999 -9999     9.99       0.000 -9999 -9999
 20190130152000 #timestamp-3
     56   39
  P                                         A
  S-4 B                               4.     E     F      3
 -9999 -9999     6.99       0.000 -9999 -9999
 -9999 -9999     9.99       0.000 -9999 -9999

EOF

猫<< EOF >文件2.txt

20190130150000 #timestamp-1
    33   55.3
  R                                         A
  S-4 B                                3.     E     F      3
 -9999 -9999     5.99       0.000 -9999 -9999
 -9999 -9999     7.99       0.000 -9999 -9999
 20190130151000 #timestamp-2
    33   55.3
  R                                         A
  S-4 B                                3.     E     F      3
 -9999 -9999     5.99       0.000 -9999 -9999
 -9999 -9999     7.99       0.000 -9999 -9999
 20190130152000 #timestamp-3
    33   55.3
  R                                         A
  S-4 B                                3.     E     F      3
 -9999 -9999     5.99       0.000 -9999 -9999
 -9999 -9999     7.99       0.000 -9999 -9999

EOF

我正在寻找一个 awk 脚本来按以下方式重新排列它:

将所有相同的时间戳与其后续行一起写入:

请注意:文件中没有这样的#timestamp字样,我只是为了便于理解而提到它。

所以欲望输出会是这样的:

猫<< EOF >out.txt

20190130150000
     56   39
  P                                         A
  S-4 B                               4.     E     F      3
 -9999 -9999     6.99       0.000 -9999 -9999
 -9999 -9999     9.99       0.000 -9999 -9999
 20190130150000
    33   55.3
  R                                         A
  S-4 B                                3.     E     F      3
 -9999 -9999     5.99       0.000 -9999 -9999
 -9999 -9999     7.99       0.000 -9999 -9999
 20190130151000
     56   39
  P                                         A
  S-4 B                               4.     E     F      3
 -9999 -9999      6.99      0.000 -9999 -9999
 -9999 -9999     9.99       0.000 -9999 -9999
 20190130151000
    33   55.3
  R                                         A
  S-4 B                                3.     E     F      3
 -9999 -9999     5.99       0.000 -9999 -9999
 -9999 -9999     7.99       0.000 -9999 -9999
 20190130152000
     56   39
  P                                         A
  S-4 B                               4.     E     F      3
 -9999 -9999     6.99       0.000 -9999 -9999
 -9999 -9999     9.99       0.000 -9999 -9999
 20190130152000
    33   55.3
  R                                         A
  S-4 B                                3.     E     F      3
 -9999 -9999      5.99      0.000 -9999 -9999
 -9999 -9999     7.99       0.000 -9999 -9999

EOF

我的脚本:

awk '
{
    if ($1 ~ /^[0-9]{14}$/) {
        timestamp = $1
        print timestamp
        next
    }
    print
}' file1.txt file2.txt

这个脚本只是打印相同的输入。它不是打印期望的输出。

linux shell awk sh
2个回答
0
投票

您可以将第一个文件中的时间戳到内容的映射存储在数组中,并在输出第二个文件的内容之前,从缓存中输出第二个文件中每个时间戳的相应内容:

NR == FNR {
    if (/^[0-9]{14}$/) {
        if (timestamp)
            store[timestamp] = content
        timestamp = $0
        content = timestamp
    } else
        content = content RS $0
    next
}
FNR == 1 {
    store[timestamp] = content
}
/^[0-9]{14}$/ {
    print store[$0]
}
1

演示:https://replit.com/@blhsing1/EcstaticDirtyParallelprocessing


0
投票

您可以尝试以下简单的方法:

cat <yourfiles> | awk '/[0-9]{14}/ { print $1;}'

时间戳前面似乎有一个空格字符。

© www.soinside.com 2019 - 2024. All rights reserved.