我有几个文件。
猫<< 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
这个脚本只是打印相同的输入。它不是打印期望的输出。
您可以将第一个文件中的时间戳到内容的映射存储在数组中,并在输出第二个文件的内容之前,从缓存中输出第二个文件中每个时间戳的相应内容:
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
您可以尝试以下简单的方法:
cat <yourfiles> | awk '/[0-9]{14}/ { print $1;}'
时间戳前面似乎有一个空格字符。