다음을 사용하여 CSV 파일의 열 7을 끝으로 이동하려고 합니다.
awk -F '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}',OFS= "$file"
여기서 $file은 디렉터리의 .csv 파일입니다. 그러나 출력은
awk: ^ syntax error
이 오류를 해결하는 방법을 아는 사람이 있나요?
답변1
이 -F
옵션에는 하나의 인수(필드 구분 기호)가 필요합니다 -F,
.
스크립트의 끝은 (공백 문자)로 나머지 매개변수와 구분되어야 합니다 awk
.
필드 구분 기호가 이고 ,
이를 유지하고 열 수가 일정하고 11보다 작거나 같은 경우 다음을 시도하십시오.
awk -F, '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' OFS=, "$file"
필드 구분 기호가 세미콜론인 경우 아래와 같이 따옴표로 묶어 설정하는 것을 잊지 마세요.
awk -f';' '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' OFS=';' "$file"
답변2
더 짧은 해결책은
awk -F',+' -v OFS=, '{$(NF+1)=$7; $7=""; $0=$0; $1=$1}1' file
,+
모든 버전에서 작동하는지 확실하지 않지만 적어도 GNU awk 및 호환 모드 awk
에서도 작동합니다 .-c
설명하다:
$(NF+1)=$7
: 먼저 줄 끝에 7번째 필드를 추가합니다(아마도$12=$7
이 경우).$7=""
: 다음 단계에서는 7번째 필드가 제거됩니다(단, 주변 구분 기호는 남아 있음).- 구분 기호를 제거하려면 전체 레코드를 다시 정렬해야 합니다( 여러 개의 쉼표를 필드 구분 기호로 처리( 여기서는 한 번 이상
$0=$0
수행됨 )). 또한 이전에 설정된 출력 필드 강제 재구축 라인을 사용 하도록 현재 레코드를 다시 정렬해야 합니다. 구분 기호(옵션으로 설정 )-F',+'
+
$1=$1
-v OFS=,
- 모든 셔플링이 완료되면 결과를 인쇄할 준비가 되었습니다.
1
입력 예:
1,2,3,4,5,6,7,8,9,10,11
산출
1,2,3,4,5,6,8,9,10,11,7
답변3
를 사용하여 인쇄하는 경우 OFS=
필드 사이에 구분 기호가 없으며 간단히 $7
변수 의 값을 저장하고 $7
빈 값으로 설정한 후 라인과 변수를 직접 인쇄할 수 있습니다. 모든 필드를 지정할 필요는 없습니다.
$ cat file
1,2,3,4,5,6,7,8
$ awk -F, -vOFS= '{k=$7; $7=""; print $0,k}' file
12345687
답변4
다양한 awk
변형(파일이 변수 안에 있다고 가정 $file
)
여기에서 모든 열을 반복하고, 필드 구분 기호(OFS)를 사용하여 인쇄하고, 행 끝에 레코드 종결자(ORS)를 인쇄할 수 있습니다.
awk -F',' -v OFS=, \ '{for(i=1;i<=NF;i++) if (i!=7) printf "%s",$i OFS; \ printf "%s",$7;printf ORS}' "$file"
여기서는 정규식을 사용하고
gensub()
기능gawk -F',+' -v OFS=, '{$0=gensub(/\s*\S+/,"",7) OFS $7}1' "$file"
죽이다7번째 필드를 입력하고 줄 끝에 인쇄합니다.
$0
전체 기록입니다$n
n번째 기록 이다NF
현재 행의 필드 수입니다.OFS
출력 필드 구분 기호ORS
출력 레코드 종결자1
true
이것은 awk에게 알려주고 기본값( )을 인쇄하는 트릭입니다$0
.
고쳐 쓰다...
7 열 이후의 모든 열을 이동할 수 있다는 사실을 거의 잊어버렸습니다 .
awk -F',' -v OFS=, '{tmp=$7; for(i=7;i<=NF;i++) $i=$(i+1); $NF=tmp}1 ' "$file"