저는 쉘 스크립팅을 처음 접했습니다. 이제 .csv 파일의 모든 행을 읽고 각 행의 열 헤더만 가져올 수 있는 셸 스크립트 코드를 찾으려고 합니다.
각 행에 대해 일부 열은 "X"로 표시됩니다(해당 행에 이름이 있음을 나타냄). 첫 번째 행의 이름(예: "row1")이 주어지면 출력에서 "X"로 표시된 열 헤더의 해당 이름을 제공하는 스크립트를 개발하고 싶습니다. 이것은 CSV 파일이므로 "X"로 표시되지 않은 열은 ; 분리 기호.
입력하다
Index,Name1,Name2,Name3,Name4
row1,X,,X
row2,,,X,
row3,X,X,X,
"row1"을 검색하면 출력은 다음과 같습니다.
산출
row1 Name1 Name3
"row3"을 검색하면 출력은 다음과 같습니다.
row3 Name1 Name2 Name3
출력을 탭으로 구분하고 싶지만 가능하지 않은 경우 쉼표로 구분해도 작동합니다. 먼저 행 이름을 파악한 다음 출력을 파이핑하여 이를 달성하려고 했습니다. 그러나 "X"가 표시된 경우 제목 이름을 인쇄하는 스크립트를 작성하는 방법을 잘 모르겠습니다. grep -w 'row1'
and 중 일부를 사용할 수 있는 아이디어가 있지만 awk -F , 'NR==1 { for (i=1;i<=NF;++i) if ($i=="X") { n=i;print $n }}'
이들을 어떻게 연결해야 할지 잘 모르겠습니다.
어떤 도움이라도 대단히 감사하겠습니다!
답변1
헤더를 배열로 분할하고 거기에서 사용합니다. 예를 들면 다음과 같습니다.
mode.awk 가져오기
BEGIN { FS="," }
NR==1 { split($0, colhead); next }
$1 ~ pat {
printf "%s", $1
for (i=2; i<=NF; i++) {
if ($i ~ /X/)
printf "\t%s", colhead[i]
}
print ""
}
예를 들어 다음과 같이 실행합니다.
awk -f getpattern.awk pat='row1|row3' infile.csv
산출:
row1 Name1 Name3
row3 Name1 Name2 Name3
답변2
나는 전용 csv
파서를 사용할 것입니다. 예를 들어 python's
csv
모듈은 다음을 수행합니다.
import csv
with open('file.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row["Index"], *[item[0] for item in row.items() if item[1] == "X"], sep=" ")
산출:
row1 Name1 Name3
row2 Name3
row3 Name1 Name2 Name3