轻量级bash脚本

时间:2014-08-21 15:13:29

标签: bash

我有一个包含这样的数据的文本文件(test.dat)

time    value1 value2
00:09:20 10 20
--
time    value3 number4
00:09:20 30 40
--

我需要提取列value1,value2,value3和number4中的值并输出

10:20:30:40

cat test.dat |
grep -A 1 -w 'value1\|value2\|value3\|number4' |
sed 's/--/\n/g' |
sed '/^$/d' |
awk 'NR%2==0' |
awk '{$1=""; print}' |
tr -d "\n"|
awk '{print $1 ":" $2 ":" $3 ":" $4}'

但这需要很多时间。有没有一种轻量级的方法来实现这种方法。

4 个答案:

答案 0 :(得分:0)

$ awk -v OFS=: 'NR%3 == 2 {print $2, $3}' test.dat | paste -sd:
10:20:30:40

答案 1 :(得分:0)

sed -nE 's/[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}:]]+) ([[:digit:]]+)/\1:\2/p'

将按照您的要求进行操作,然后您需要将结果输入

tr "\n" ":"

答案 2 :(得分:0)

为什么要使用sed或awk? 如果文件格式始终相同,则可以使用:

while read line; do
    if [ "${line:0:4}" == "time" ]; then
        read number
        outText="${outText}$(echo "$number"|cut -d' ' -f2-|tr ' ' ':'):"
    fi
done<test.dat
outText=${outText%:} # Remove last unuseful :
echo "$outText"

答案 3 :(得分:0)

每当您同时使用grepsedawk时,您通常可以删除grep和sed并使用awk执行所有操作。

awk '/^[0-9]/ { if ( ! printed ) {
        printf $2 ":" $3
        printed=1
    }
        else {
        printf ":" $2 ":" $3
    }
}' test.txt