0

我有一个包含数千行的数据文件,每行包含 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}'

我的问题是每次运行此脚本时都会输出不同数量的行。我已经确定,如果我不洗牌文件,那么一切都会按预期工作。提前致谢。

4

3 回答 3

2

您使用错误的符号来打印带有 的行sed,它应该是:

sed -n 'fromline,toline p'

当前,您正在从第 1 行打印到包含 的任何一行/$number/,或者在第二种情况下,从包含的第一行打印到包含随机输入/${number}/的下一行,/${numlines}/这是相当不可预测的。

于 2013-05-13T06:44:20.817 回答
1

如果您无论如何都在使用 Awk,那么写起来可能更清楚

shuf $1 | awk 'NR <= '$number' {$5=0} {print}'
于 2013-05-13T07:44:41.170 回答
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 文件

于 2013-05-13T06:46:17.513 回答