파일(.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
또는 ) 를 이해하는 쉘이 필요하며 ksh
GNU의 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번째 레코드(즉, 행))