2017-03-08 2 views
1

일부 다운 스트림 프로세스에서 사용하기 위해 분할하려고하는 줄이 너무 많습니다 (~ 4000 만). 이 파일은 다음과 같습니다.리눅스 : 글자가있는 새 줄을 파일에 추가하십시오.

a 
b 
c 
d 
e 

줄을 매 줄마다 '> n'문자열로 추가하여 파일을 분리하고 싶습니다. 이러한 목적을 위해 2 행 예제가 좋을 것입니다. 나는이 작업을 수행 할 수 나오지도 꽤 확신하지만이 증가하는 부분은 알아 냈 얻을 관리 할 수 ​​없습니다 내 최종 출력이

a 
b 
>1 
c 
d 
>2 
e 

싶습니다.

+1

* 파일을 분할하고 싶습니다. * 파일을 여러 파일로 나눕니다. 또는 각 만 줄 뒤에'>> n '을 삽입 하시겠습니까? – RomanPerekhrest

+0

각 1M 라인 이후에> n을 삽입하기 만하면됩니다. 다운 스트림 '>'을 사용하는 소프트웨어에서 분할을 나타냅니다. 아마도 파일을 '해체'하면 더 좋은 용어가됩니다. –

+0

awk가 sed보다 더 나은 선택이 될 것입니다 ... – Sundeep

답변

2

AWK 여기에 더 나은 선택입니다. 당신이 그렇게에

awk 'BEGIN{i=0}; {if ((NR-1) % 1000000 == 0) {i++; print ">" i}}; {print}' your_file > another_file 

이 하나가 "your_file"직접 "your_file1", "your_file2"라는 이름의 파일에 파일을 분할하고, 소원처럼

이 하나의 선을 삽입합니다.

awk 'BEGIN{i=0}; {if ((NR-1) % 1000000 == 0) {i++}} {print > "your_file" i}' your_file 
+0

당신은 당신의 조건에도 && NR> 1을 더할 수 있습니다. – RavinderSingh13

+0

감사합니다. –

0

(AFAIK) 변수를 처리 할 수 ​​없기 때문에 sed가 모든 것을 자체적으로 수행 할 수 있다고 생각하지 않지만 awk는이를 처리 할 수 ​​있습니다. 그런 다음 스크립트

BEGIN { 
    id=0;  
} 

{ 
    if (NR % nth == 0) { 
     print ">"id; 
     id++;  
    } else { 
     print $0 
    } 
} 

END {} 

을 사용하여 그것을 이런 식으로 실행할 수 있습니다

awk -v nth=<your N value> -f /script/name > /new/file 
+1

OP의 예상 출력과 일치시키기 위해'id = 1' ...'NR % nth == 0' 일 때'$ 0'을 출력하거나 항상 출력하고 조건을 검사하면 ...' awk -v nth = 2 '{print} NR % nth == 0 {print ">"++ c}'file' – Sundeep

+1

이것은 원하는 내용이 아니므로 ** n 번째 줄을 ">" – putonspectacles

+0

@putonspectacles 아니오, "id"로 바꿉니다. –

4

@Stephen :

awk -v num=2 'FNR % num == 0 {print $0 ORS ">"++q ;next} 1' Input_file 

마찬가지로, 위의 줄 번호를 제공 할 수 및 출력에 다음을 인쇄 할 수 있습니다 :보십시오. 또한 사용자가 여러 Input_files를 사용할 때마다 다음 파일이 올 때마다 FNR의 값을 재설정하고 다음 Input_file (NR은 수행하지 않음)에서 처음부터 시작할 것입니다.

편집 : 코드의 전체 설명을 추가해도됩니다. 나는 간단한 쉘 스크립트 (upline.sh를) 이렇게 wolud

awk -v num=2   #### Setting a variable named num to value 2 here. 
'FNR % num == 0  #### Checking condition if FNR%num==0 is TRUE then it should perform following actions. Where FNR is awk built-in keyword to get the line number, only difference between FNR and NR is FNR gets RESET whenever a new Input_file gets read. As we know awk could read multiple Input_files, so 
          in this case FNR could be really helpful compare to NR. 
{print $0 ORS ">"++q ; #### printing the current line's value(off course when above condition is TRUE) with ORS(output field separator) whose default value is new line and then printing ">" and a variable named q whose value will always increase each time cursor comes in this section. 
next}     #### mentioning next keyword here which will help us to skip all other further statements when this condition met so that we could save our time. 
1      #### awk works on condition then action pattern so here by putting 1 I am making condition as TRUE and then specifying no action so by default print will happen which will print the entire line. 
' Input_file   #### mentioning the Input_file here. 
+1

이 대답은 명령이 설명 된 경우 더 좋을 것입니다. 예를 들어'-v var = num'은 프로그램 시작 전에 변수 num을 var에 대입합니다. FNR이 무엇을하는지 설명하고 ++ q – putonspectacles

+0

나는 내가 당신이 논평 한 같은 시간에 설명을 추가했다고 생각한다. :) – RavinderSingh13

0

:

EVERYLINE=2 

LINECOUNT=0 
COUNTER=1 

#read file line by line 
while read LINE; do 

    #print current line 
    echo $LINE 

    #increment linecounter 
    ((LINECOUNT++)) 

    #check if we have to insert an additional line 
    if [ $LINECOUNT -eq $EVERYLINE ]; then 
     #print additional line 
     echo ">n$COUNTER" 

     #increment counter for additional line 
     ((COUNTER++)) 

     #reset linecounter 
     LINECOUNT=0 
    fi 
done 
는 변수 "EVERYLINE"컨트롤이 얼마나 많은 줄 끝에서

bash upline.sh < youtdatafile.txt 

로 시작

여분의 라인이 삽입됩니다. 또한

EVERYLINE=$1 

가 매개 변수로 "분할 수를 제공하는 데 사용할 수있는이 (나오지 GNU)을 당신을 위해 작동 할 수

1

:.

seq -f'>%g' 1000000 | sed '0~1000000R /dev/stdin' file 

이 시퀀스를 생성하는 seq를 사용 필요한만큼의 파일 분배기를 추가 한 다음 모듈로 연산 from~step을 사용하여 입력 파일에 삽입합니다.완전히 나오지도 있지만 권장되지

또 다른 방법은 다음과 같습니다

sed -r '0~1000000!b;p;x;s/^9*$/0&/;:a;s/9(x*)$/x\1/;ta;s/$/#/;s/(.)(x*)#.*\1(.).*/\3\2/;s/x/0/g;h;s/^/>/' file 

이 같은 모듈로 연산을 사용 한 후 출력 파일에 삽입하기 전에 대기 공간과 단위를에서 카운터를 유지합니다.

그러나. 이 연습의 진정한 의도는 큰 파일을 작은 파일로 split으로 보내는 것이므로 split을 사용하지 않는 이유는 무엇입니까? 이 >1라는 이름의 파일로 파일을 분할

split -a1 --numeric-suffixes=1 -l 1000000 file '>' 

.. >n 만 라인의 각.

관련 문제