40줄 파일에서 2줄씩 추출하고 새 파일을 만듭니다.

40줄 파일에서 2줄씩 추출하고 새 파일을 만듭니다.

다음과 같은 40줄 파일이 있습니다.

0001.Group   admin_group
0001.Users   adam, sam, paul, david, jennifer, harry
0002.Group   Dev_group
0002.Users   mike, pauli, gary, sherry
0003.Group   Sec_group
0003.Users   david, diana, mike, paul, harry
0004.Group   Main_group
0004.Users   wilson, robert, samule

접두사를 사용하여 그룹과 사용자를 추출하고 그룹과 동일한 이름으로 새 파일을 만들어야 합니다.

다음과 같아야 합니다.

  • 출력 파일 이름: admin_group, 내용:

    0001.Group   admin_group
    0001.Users   adam, sam, paul, david, jennifer, harry
    
  • 출력 파일 이름: Dev_group, 내용:

    0002.Group   Dev_group
    0002.Users   mike, pauli, gary, sherry
    

마지막으로 20개의 새 텍스트 파일이 필요합니다. sed와 awk를 사용하여 두 개의 별도 파일을 만들려고 시도했지만 실패했습니다. Bash나 Python에서 어떻게 얻을 수 있나요?

답변1

그리고 awk:

$ awk -v FS="\t" '$1 ~ /Group/ { file = $2 } { print $0 > file }' input.txt

awkGroup첫 번째 열에 하나가 있는지 확인하십시오. 이 경우 두 번째 열의 값을 변수에 저장합니다 file.

확인한 후 전체 줄이 인쇄되고 >이름이 변수에 저장된 파일로 리디렉션됩니다 file.

답변2

sed편집기를 사용하여 입력 파일에 대해 2개의 패스를 실행할 수 있습니다 . 첫 번째 단계에서는 원하는 출력을 생성하기 위해 두 번째 단계에서 사용할 sed 명령 목록을 생성합니다.

$ sed -ne '
      s/.*[[:blank:]]//
      s|.*|/&/{N;w &\n}|w sed_code
      n
 '  input-file.txt 

그래서 이번이 두 번째입니다. 생성될 파일 이름에는 정규식 특수 문자가 포함되어 있지 않다고 가정합니다.

$ sed -nf sed_code input-file.txt

이 작업을 수행하기 위해 Perl을 배포할 수도 있습니다.

 $ perl -aMautodie -pe '
    open my $fh, ">", $F[1];
    $_ .= <>;
    select $fh;
 ' input.txt

답변3

awk 버전만큼 똑똑하지는 않지만 여기에 대안이 있습니다.

497844.txt가 파일 이름입니다. 문제번호를 사용했어요

for f in `cut -f1 -d. 497844.txt | sort | uniq`
do
    group=`grep $f.Group 497844.txt`
    fn=`echo $group| cut -f2 -d" "`
    grep ^$f 497844.txt > $fn
done

설명하다.

각 고유 그룹 번호에 대해 그룹을 포함하는 줄의 값인 파일 이름을 얻습니다.

그런 다음 해당 그룹 번호가 포함된 각 줄을 추출하고 위에서 내보낸 파일로 출력을 리디렉션합니다.

관련 정보