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