올바르게 생성되지 않은 텍스트 파일이 있습니다. 텍스트 파일을 만든 사람에게 출력 내용을 수정하도록 요청하고 있지만 이는 시간이 오래 걸리므로 그동안 임시 해결 방법으로 제가 가지고 있는 문제를 수정해 보고 싶습니다.
파일에는 |
파이프( ) 구분 기호로 구분된 9개의 필드가 포함되어야 합니다. 아쉽게도 두 번째 필드는반품세로 막대로 구분된 여러 필드입니다. 그리고 이스케이프나 인용은 사용되지 않습니다. 따라서 9개보다 훨씬 더 많은 필드가 있습니다.
첫 번째 필드와 마지막 7개 필드를 그대로 사용하고 중간 필드를 단일 필드로 변환하거나 구분 기호를 억제하거나 공백으로 대체하여 이 문제를 해결하고 싶습니다.
몇 가지 예:
field1|field2|field3||||||field9
1a|DAVID|JOY|02022|4|5|6|7|8|9
1b|DAVID|JOY|ZYN|02022|4|5|6|7|8|9
출력이 될 것으로 예상합니다.
field1|field2|field3||||||field9
1a|DAVIDJOY|02022|4|5|6|7|8|9
1b|DAVIDJOYZYN|2022|4|5|6|7|8|9
쉘 레벨 도구를 사용하여 이 작업을 어떻게 수행할 수 있습니까?
답변1
GNU를 사용하면 sed
다음을 사용할 수 있습니다.
sed ':1;s/|/|/9;T;s/|//2;t1'
|
출력에 필드가 9개 이하가 될 때까지 두 번째 필드와 세 번째 필드를 필요한 만큼 연결합니다(두 번째 항목 제거 ).
다음과 같이 입력하면:
1|a|3|4|5|6|7|8|9
1|a|b|3|4|5|6|7|8|9
1|a|b|c|3|4|5|6|7|8|9
그것은 다음을 제공합니다:
1|a|3|4|5|6|7|8|9
1|ab|3|4|5|6|7|8|9
1|abc|3|4|5|6|7|8|9
GNU가 아닌 시스템에서는 다음을 사용할 수 있습니다.@RakeshSharma의 POSIX sed
변형또는 perl
다음으로 변경:
perl -F'[|]' -lae 'BEGIN {$" = ""; $, = "|"}
print $F[0], "@F[1..$#F-7]", @F[-7..-1]'
답변2
GNU awk 사용
awk '{
while ( gsub(/\|/, "|") > 8 )
$0 = gensub(/\|/, "", 2)
}1' file
Posix sed 사용:
sed -e '
:a
s/|/&/9;tb
b
:b
s///2;ta
' file
답변3
구분 기호를 사용하여 파일을 구문 분석하여 배열을 만듭니다.
IFS='|' read -r -a fields thefile
종료하기 전에 항목 2~8을 연결하십시오.
field=${fields[1]} ;
i=2 ;
max=$((${#fields[*]}-8));
while [[ $i -le $max ]] ;
do
field="$field ${fields[$i]}" ;
(( ++i )) ;
done ;
echo $field
답변4
이를 수행하는 또 다른 방법은python
<file python3 -c '
import sys
for line in sys.stdin:
first, _, rest = line.strip().partition("|")
rest_fields = rest.rsplit("|", 8)
print(first, rest_fields[0].replace("|", ""), *rest_fields[1:], sep="|")
'