我有一个包含这样的数据的文本文件(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}'
但这需要很多时间。有没有一种轻量级的方法来实现这种方法。
答案 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)
每当您同时使用grep
,sed
和awk
时,您通常可以删除grep和sed
并使用awk
执行所有操作。
awk '/^[0-9]/ { if ( ! printed ) {
printf $2 ":" $3
printed=1
}
else {
printf ":" $2 ":" $3
}
}' test.txt