2013-05-13 2 views
0

나는 5 개의 숫자로 구성된 수천 줄의 데이터 파일을 가지고 있습니다. 예를 들어 :sed를 통해 파이프 된 셔플은 다른 수의 줄을 제공합니다.

23 31 56 21 34 
34 76 34 75 32 
... 
... 
나는 무작위로 n 개의 % 선을 선택하기 위해 bash는 스크립트를 작성하려는

및 항목의 나머지 부분을 0으로 설정 마지막 항목으로 출력 할 난 그냥 출력 라인으로 원하는 그것은. 나는 어떤 순서로 줄이 출력되는지 신경 쓰지 않는다.

파일을 섞어서 첫 번째 n % 줄을 취한 후 awk을 사용하여 마지막 위치에서 0으로 인쇄하십시오. 그런 다음 나머지 줄을 출력합니다. 내 시도는 다음과 같습니다.

#! /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}' 

문제점이 스크립트를 실행할 때마다 다른 수의 줄이 출력됩니다. 나는 파일을 섞지 않으면 예상대로 작동한다는 결론을 내렸다. 미리 감사드립니다. 당신은 sed으로 라인을 인쇄 잘못된 표기법을 사용하는

답변

2

, 그것은해야한다 : 현재

sed -n 'fromline,toline p' 

당신은 라인 /$number/을 포함 중에 라인 1에서 인쇄, 또는 첫 번째 줄에서 두 번째 경우에 포함된다 /${number}/을 포함하는 다음 줄에 /${numlines}/이 포함되어 있습니다. 임의 입력으로 예측할 수 없습니다.

0

사용 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" 

사용법 : 파이썬 shuffle.py 파일

1

어쨌든 awk는를 사용하는 경우, 그것은 쓰기 아마 더 분명

shuf $1 | awk 'NR <= '$number' {$5=0} {print}'