0

それぞれが 5 つの数値で構成される、数千行のデータ ファイルがあります。例えば:

23 31 56 21 34
34 76 34 75 32
...
...

n% 行をランダムに選択し、最後のエントリを 0 に設定して出力する bash スクリプトを作成したいと考えています。残りのエントリについては、行をそのまま出力したいだけです。行がどの順序で出力されるかは気にしません。

これを行う私の試みは、ファイルをシャッフルし、行の最初の 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'

/$number/現在、1 行目から を含む行まで、または 2 番目のケースでは、最初の行から を含む/${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 に答える