awk/sed를 사용하여 필드를 길이로 자릅니다.

awk/sed를 사용하여 필드를 길이로 자릅니다.

파이프로 구분된 여러 필드가 포함된 파일이 많이 있습니다.

5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|1212121212121212121212121212|2|0|1000|70|33107||1|이벤트 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|2323232323232323232323232323|2|0|1000|70|33107||1|이벤트 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|3434343434343434343434343434|2|0|1000|70|33107||1|이벤트 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|4545454545454545454545454545|2|0|1000|70|33107||1|이벤트 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|5656565656565656565656565656|2|0|1000|70|33107||1|이벤트

여덟 번째 필드에 주목하세요. 현재 29자이므로 5자로 줄여야 합니다.

내가 생각해낸 유일한 (복잡한) 해결책은 다음과 같습니다.

다듬고 싶은 필드를 분리합니다.

awk -F "|" '{print $8}' > Original_Fields

필드 자르기

cp Original_Fields Temp
more Temp | cut -c -5 > Trimmed_Fields

sed를 사용하여 대체 스크립트 만들기

grep -rh -f <file_with_matching_strings> /path/to/files > Original_Strings
vi Original_Strings
:%s/^/grep -rl "/g
:%s/$/" \/path\/to\/file | xargs sed -i 's\//g
:wq!

그런 다음 Original_Fields 및 Trimmed_Fields 파일을 편집하여 다음과 같이 만듭니다.

grep -rl /path/to/file | xargs sed -i 's/Original_Field/Trimmed_Field/g'

이것이 효과가 있지만 AWK와 SED를 사용하여 이 작업을 수행하는 더 빠른 방법이 있어야만 이 모든 것을 한 단계로 수행할 수 있을 것이라고 강력하게 의심합니다.

답변1

예, AWK를 사용하여 각 행을 자르고 다시 작성할 수 있습니다.

awk -F'|' 'BEGIN { OFS = FS } { $8 = substr($8, 1, 5); print }'

입력 및 출력 구분 기호를 "|"로 설정하고 각 입력 줄에 대해 8번째 필드를 최대 5자로 자르고 모든 필드(업데이트된 필드 포함)를 인쇄합니다.

답변2

파일의 너비가 고정되어 있거나 적어도 그럴 것 같으므로 sed에서 유지하고 삭제할 열 수를 계산할 수 있습니다.

sed -r 's/(.{68}).{23}(.*)/\1\2/' yourfile

관련 정보