쉘 스크립트의 텍스트 파일에서 열을 연결하고 복합 키를 생성합니다.

쉘 스크립트의 텍스트 파일에서 열을 연결하고 복합 키를 생성합니다.

쉘 스크립트에서 기능을 구현하려고 시도했지만 어떻게든 구현이 중단되어 도움이 필요합니다.

Sample File - f1.txt

col1|col2|col3|rev|spt
A1|54|tyre|56.89|45.23
B1|54|pole|11.89|85.23
C1|54|ture|112.89|185.23

파일에는 여러 개의 열이 있을 수 있으며 고정되어 있지 않습니다. 내가 이루고 싶은 것은 ->

Concatenate all the Columns in the File (Note- It can have any number of Columns) except the Columns- rev and spt

Whenever it Finds Column Name as rev or spot it shouldnot include in Concatenation.
Example-

Output-
KeyCol|rev|spot
A1~54~tyre|56.89|45.23
B1~54~pole|11.89|85.23
C1~54~ture|112.89|185.23

따라서 이상적으로는 원하는 수의 열(rev 및 Spot이라는 열 제외)이 있는 모든 파일에 Composite를 만들고 싶습니다.

도와주세요

답변1

awk다음 명령을 사용할 수 있습니다.

awk -F'|' 'NR==1 {OFS=FS; print "KeyCol", $(NF-1), $NF} NR > 1 {OFS="~"; LAST=$(NF-1) FS $NF; NF-=2; print $0 FS LAST}'

설명하다

  • -F '|'입력 필드 구분 기호가 임을 나타냅니다 |.
  • NR==1첫 번째 행만 작동됨을 나타냅니다. 첫 번째 줄에서는 첫 번째 필드의 "KeyCol"만 인쇄되고 마지막 두 필드가 인쇄되며 OFS(출력 필드 구분 기호)는 (입력 필드 구분 기호)가 됩니다. FS이 경우에는 입니다 |.
  • 첫 번째 줄 뒤의 다음 줄( ) NR > 1:
    • OFS="~"새 출력 필드 구분 기호가 임을 의미합니다 ~.
    • LAST=$(NF-1) FS $NF- 마지막 두 필드를 이름이 지정된 문자열 변수에 저장 LAST하고 FS(입력 필드 구분 기호)로 구분합니다.
    • NF-=2- NF마지막 두 필드를 제외하려면 필드 수( )를 2만큼 줄입니다.
    • print $0 FS LAST
      • $0이제 첫 번째(NF-2) 필드만 유지됩니다.
      • 이를 인쇄하여 사용합니다 OFS(이 경우~
      • 다음은 원본 텍스트입니다 FS(예: |).
      • LAST 변수는 마지막 두 필드를 보유합니다.

산출

awk -F'|' 'NR==1 {OFS=FS; print "KeyCol", $(NF-1), $NF} NR > 1 {OFS="~"; LAST=$(NF-1) FS $NF; NF-=2; print $0 FS LAST}' f1.txt
KeyCol|rev|spt
A1~54~tyre|56.89|45.23
B1~54~pole|11.89|85.23
C1~54~ture|112.89|185.23

참고 1

OFS="~"라인을 라인 끝으로 이동할 수 있습니다. NR==1그러면 다음 레코드에 모두 적용되고 모든 라인에 대해 설정할 필요가 없기 때문입니다.

awk -F'|' 'NR==1 {OFS=FS; print "KeyCol", $(NF-1), $NF; OFS="~"} NR > 1 {LAST=$(NF-1) FS $NF; NF-=2; print $0 FS LAST}'

노트 2

이를 자동화하기 위해 awk 스크립트를 만들 수 있습니다.

$ cat composite.awk
BEGIN { FS = "|" }
NR == 1 {
  OFS=FS
  print "KeyCol", $(NF-1), $NF
  OFS="~"
} 
NR > 1 {
  LAST=$(NF-1) FS $NF
  NF-=2
  print $0 FS LAST
}

command 에 인수가 필요하지 않도록 BEGIN설정 섹션 을 추가했습니다 .FS-F '|'awk

그런 다음 스크립트 파일을 사용하여 실행합니다.

$ awk -f composite.awk f1.txt                                                                                            
KeyCol|rev|spt
A1~54~tyre|56.89|45.23
B1~54~pole|11.89|85.23
C1~54~ture|112.89|185.23

관련 정보