다음 텍스트 파일의 "빈" 열을 채우도록 AWK를 얻으려고 합니다.
AWK NF를 사용하여 가장 긴 행을 찾고 해당 열에 값이 없는 행을 확인하는 기본 아이디어입니다. 그런 다음 각 빈 열에 x회 N/A를 추가합니다.
이 예제에는 공백으로 구분된 입력이 있지만 문자로 구분된 파일로 쉽게 변경할 수 있습니다.
입력은 다음과 같습니다.
aaa bbb ccc ddd
aaa
aaa bbb ccc
hhh ppp uuu
www yyy hhh
hhh 111 333 yyy ooo hyy uuuioooy
그리고 출력에서는 파일의 최대 열 수를 계산하고 빈 열에 N/A를 추가합니다.
aaa bbb ccc ddd N/A N/A N/A
aaa N/A N/A N/A N/A N/A N/A
aaa bbb ccc N/A N/A N/A N/A
hhh ppp uuu N/A N/A N/A N/A
www yyy hhh N/A N/A N/A N/A
hhh 111 333 yyy ooo hyy uuuioooy
답변1
가장 쉬운 방법은 두 단계로 수행하는 것입니다. 먼저 가장 넓은 선을 찾습니다.
max=$(awk 'max < NF { max = NF } END { print max }' infile)
그런 다음 다른 열을 채울 때 이를 입력으로 사용합니다.
awk -v max=$max '{ for(i=NF+1; i<=max; i++) $i = "N/A"; print }' infile
답변2
awk 'FNR==NR{if(m<NF)m=NF;next}{for(i=NF;i<m;i++)$(i+1)="N/A"}1' tiny.txt tiny.txt
입력 파일 이름은 두 번 지정됩니다.
답변3
파일에 누락된 필드가 있는 행에 있는 모든 열에 대한 필드 구분 기호가 있는 경우 누락된 필드가 행 끝뿐만 아니라 행 내에 있는 경우도 처리하는 또 다른 좋은 솔루션이 있습니다. 예를 들어 빈 셀이 있는 스프레드시트(올바른 구분 기호를 사용하는 경우)입니다.
예를 들어. 공백으로 구분된 파일의 경우
aaa bbb ccc ddd ggg
aaa abb ccc
www yyy hhh
www yyy 333 yyy ooo hyy
당신은 그것을 사용할 수 있습니다
awk -F'[ ]' '{OFS=" ";for(i=1;i<=NF;i++){if($i==""){$i="N/A"}};print}' infile.txt
또는 탭으로 구분된 경우:
awk -F'\t' '{OFS="\t";for(i=1;i<=NF;i++){if($i==""){$i="N/A"}};print}' infile.txt
DOS/Windows 생성 파일에 주의하세요. Excel에서는 캐리지 리턴을 제거해야 합니다.
cat infile.txt | tr -d '\r' | awk -F'[ ]' '{OFS=" ";for(i=1;i<=NF;i++){if($i==""){$i="N/A"}};print}'
아마도 이는 문제에 정확히 맞지 않을 수도 있지만 많은 사용자에게 유용할 수 있습니다.