我有一个包含数千行的数据文件,每行包含5个数字。例如:
23 31 56 21 34
34 76 34 75 32
...
...
我想编写一个bash脚本来随机选择n%行,并输出最后一个条目设置为0.对于其余的条目,我只想按原样输出行。我不在乎输出行的顺序。
我尝试这样做是为了对文件进行随机播放,然后取出前n%的行并使用awk
在最后一个位置用零打印它们。然后我输出剩余的行。这是我的尝试:
#! /bin/bash
number=$2
numlines=$(less $1 | wc -l)
number=$(echo $number'*'$numlines | bc)
number=$(echo $number'/'100 | bc)
shuffledFile=$(less $1 | shuf)
# following line echos the shuffled file, gets the first $number lines, and prints them with a zero in the final column
echo "$shuffledFile" | sed -n --unbuffered "1,/$number/p" | awk '{print $1" "$2-7200" "$3" "$4" 0"}'
echo "$shuffledFile" | sed -n "/${number}/,/${numlines}/p" | awk '{print $1" "$2" "$3" "$4" "$5}'
我的问题是每次运行此脚本时都会输出不同数量的行。我已经确定如果我不对文件进行随机播放,那么一切都按预期工作。提前谢谢。
答案 0 :(得分:2)
您使用错误的符号打印sed
行,应该是:
sed -n 'fromline,toline p'
目前,您要从第1行打印到包含/$number/
的任何一行,或者在第二种情况下从包含/${number}/
的第一行打印到包含/${numlines}/
的以下行,其中包含随机输入,是不可预测的。
答案 1 :(得分:1)
如果你正在使用Awk,那么编写
可能会更清楚shuf $1 | awk 'NR <= '$number' {$5=0} {print}'
答案 2 :(得分:0)
将此python脚本用作shuffle.py:
import sys
from random import shuffle
list1 = []
for line in open(sys.argv[1]):
list1.append(line)
percent = 60
lim = percent * len(list1) // 100
shuffle(list1)
for i,line in enumerate(list1):
if i > lim :
print line,
else :
print " ".join(line.split()[:4]),"0"
用法:python shuffle.py文件