unix를 사용하여 열 복사 및 바꾸기 [중복]

unix를 사용하여 열 복사 및 바꾸기 [중복]

파일(.txt)의 첫 번째 열을 복사하고 Unix 코드로 구분된 텍스트를 사용하여 두 번째 파일의 첫 번째 열로 바꾸고 싶습니다.

입력 파일 형식 파일 1

01/01/2007
02/01/2007
03/01/2007
04/01/2007

파일 2

20070101 10.2317  79.1638   6.0  26.7  20.9   0.8  14.0  98.6
20070102 10.2317  79.1638   5.6  26.5  20.8   1.9  13.6  98.0
20070103 10.2317  79.1638   7.5  27.7  20.8   0.1  15.8  96.4
20070104 10.2317  79.1638   8.1  26.0  19.6   0.0  15.5  94.1

출력이 필요함

01/01/2007  10.2317   79.1638   6.0  26.7  20.9   0.8  14.0  98.6
02/01/2007  10.2317   79.1638   5.6  26.5  20.8   1.9  13.6  98.0
03/01/2007  10.2317   79.1638   7.5  27.7  20.8   0.1  15.8  96.4
04/01/2007  10.2317   79.1638   8.1  26.0  19.6   0.0  15.5  94.1

답변1

$ cut -d' ' -f 2- file2 | paste file1 -

cut첫 번째 열이 제거 됩니다 file2( -f 2-"출력 필드(열) 2 이상만"을 의미). 그 결과는 첫 번째 열에 paste내용을 배치하기 위해 전달됩니다 . file1명령 -에는 paste표준 입력(이 경우 파이프)으로 전달되는 내용에 대한 자리 표시자가 있습니다.cut

단계별:

$ cut -d' ' -f 2- file2
10.2317  79.1638   6.0  26.7  20.9   0.8  14.0  98.6
10.2317  79.1638   5.6  26.5  20.8   1.9  13.6  98.0
10.2317  79.1638   7.5  27.7  20.8   0.1  15.8  96.4
10.2317  79.1638   8.1  26.0  19.6   0.0  15.5  94.1

$ cut -d' ' -f 2- file2 | paste file1 -
01/01/2007      10.2317  79.1638   6.0  26.7  20.9   0.8  14.0  98.6
02/01/2007      10.2317  79.1638   5.6  26.5  20.8   1.9  13.6  98.0
03/01/2007      10.2317  79.1638   7.5  27.7  20.8   0.1  15.8  96.4
04/01/2007      10.2317  79.1638   8.1  26.0  19.6   0.0  15.5  94.1

cut명령에는 탭으로 구분된 입력이 필요하지만 귀하의 질문에서 복사하여 붙여넣었기 때문에 공백으로 구분되어 있습니다. 원시 데이터가 실제로 탭으로 구분된 경우 명령 -d' '에서 제거하십시오.cut

기본적으로 이 paste명령은 열 1과 2 사이에 탭을 추가합니다. 공간을 원하시면 를 이용하세요 paste -d' ' file1 -.

존재하다또 다른 문제file2, 누군가 이미 여기에 있는 날짜를 사용하고 첫 번째 파일을 완전히 삭제하는 방법을 물었습니다 .

나는 결국 얻는다

$ paste <( date -f <( cut -d ' ' -f 1 file2 ) +"%d/%m/%Y" ) \
        <( cut -d ' ' -f 2- file2 )
01/01/2007      10.2317  79.1638   6.0  26.7  20.9   0.8  14.0  98.6
02/01/2007      10.2317  79.1638   5.6  26.5  20.8   1.9  13.6  98.0
03/01/2007      10.2317  79.1638   7.5  27.7  20.8   0.1  15.8  96.4
04/01/2007      10.2317  79.1638   8.1  26.0  19.6   0.0  15.5  94.1

<( ... )이를 위해서는 프로세스 대체( 예: bash또는 ) 를 이해하는 쉘이 필요하며 kshGNU의 date.

몇 가지 설명이 필요할 수 있습니다.

프로세스 대체<( ... ) 다소간대괄호 안에 명령 출력이 포함된 임시 파일을 생성합니다(실제로는 아래 FIFO /dev/fd). 따라서 전체 명령은 두 단계로 대체됩니다.

<( 날짜 -f 붙여넣기컷 출력 1+"%d/%m/%Y")\
      cut2의 출력

date -f filename파일의 날짜를 읽고 filename주어진 형식 문자열에 따라 각 날짜의 형식을 지정합니다.

그 다음에:

반죽출력 날짜 cut2의 출력

date첫 번째 열의 출력 및 두 번째 열의 출력과 함께 열을 cut다른 열로 붙여넣습니다 .

답변2

awk버전 에 따라 다음을 사용하여 첫 번째 열을 변환할 수 있습니다.

awk '{$1=substr($0,7,2)"/"substr($0,5,2)"/"substr($0,1,4); print $0}'  FILE2.csv

예:

echo "20070101 10.2317  79.1638   6.0  26.7  20.9   0.8  14.0  98.6"  | awk '{$1=substr($0,7,2)"/"substr($0,5,2)"/"substr($0,1,4); print $0}'

반품:

 01/01/2007 10.2317 79.1638 6.0 26.7 20.9 0.8 14.0 98.6

노트:

첫 번째 부분은 첫 번째 열의 값을 재정의합니다.

 $1=substr($0,7,2)"/"substr($0,5,2)"/"substr($0,1,4)

print $0전체 행을 인쇄하고 첫 번째 열을 다시 정의합니다 .

답변3

이를 달성하기 위해 awk를 사용할 수 있습니다.

awk 'NR==FNR{a[++i]=$1;next}{$1=a[++k]; print}' file1 file2

NR==FNR패턴 의미는 다음과 같습니다.{a[++i]=$1;next} file1의 각 레코드(즉, 라인)에 대해 실행합니다.

a[++i]=$1;next방법:레코드의 첫 번째 필드(즉, 행)를 레코드 번호(즉, file1의 줄 번호)의 인덱스와 함께 배열에 저장하고 다음 레코드를 읽습니다.

$1=a[++k]; print방법:인덱스 k에 있는 배열의 내용을 현재 레코드의 첫 번째 필드(즉, 행)에 복사합니다.(항상 file2의 k번째 레코드(즉, 행))

관련 정보