![csv 파일의 열을 다른 파일의 열로 바꾸기](https://linux55.com/image/37079/csv%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EC%97%B4%EC%9D%84%20%EB%8B%A4%EB%A5%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EC%97%B4%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EA%B8%B0.png)
다음과 같은 두 개의 샘플 파일이 있습니다.
$ cat file1
abc,sachin
cat,kumar
$ cat file2
xyz
pressure
$ cat file3
xyz,sachin
pressure, kumar
file1
첫 번째 열 을 file2
.
나는 다음과 같이하려고합니다 :
$ awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' file1 file2
저는 Solaris 10을 사용하고 있는데 이 기능을 지원하지 않는 것 같습니다. 다른 제안이 있나요?
답변1
cut
및 를 사용하는 것은 어떻습니까 paste
? 쉘이 프로세스 대체를 지원하는 경우
$ paste -d, file2.txt <(cut -d, -f2 file1.txt)
xyz,sachin
pressure,kumar
답변2
입력 필드 구분자를 지정해야 합니다. 또한, 당신이 어떤 분야를 선택하는지 모르겠습니다. awk에서는 필드가 1부터 시작합니다. 두 입력 파일 모두에서 3개의 필드가 누락되었습니다.
다음이 도움이 될 것입니다:
awk -F, 'FNR==NR{a[NR]=$1;next}{$1=a[FNR]}1' OFS=, file2.txt file1.txt
예제 입력의 경우 다음이 생성됩니다.
xyz,sachin
pressure,kumar
답변3
/usr/xpg4/bin/awk
@devnull의 답변 또는 을 사용해보십시오 nawk
.
/usr/bin
아래와 /bin
위의 프로그램 중 상당수는 호환 Solaris
되지 POSIX
않습니다.
perl
또는 휴대용 으로 사용할 수 있습니다 .
$ perl -nle '
unless (/,/) {
push @a, $_;
next;
}
@l = split ",", $_;
print "$a[$i++],$l[1]";
' file2.txt file1.txt
xyz,sachin
pressure,kumar
더 짧게:
$ perl -F',' -anle '
if (@F == 1) {push @a,$_;next}
print "$a[$i++],$F[1]";
' file2.txt file1.txt