다음과 같은 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
awk
Group
첫 번째 열에 하나가 있는지 확인하십시오. 이 경우 두 번째 열의 값을 변수에 저장합니다 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
설명하다.
각 고유 그룹 번호에 대해 그룹을 포함하는 줄의 값인 파일 이름을 얻습니다.
그런 다음 해당 그룹 번호가 포함된 각 줄을 추출하고 위에서 내보낸 파일로 출력을 리디렉션합니다.