알파벳 범위를 기준으로 구분된 파일에서 줄을 가져옵니다.

알파벳 범위를 기준으로 구분된 파일에서 줄을 가져옵니다.

제가 해결하고 있는 문제는 "|"로 구분된 필드를 포함하는 파일이 있고 파일이 이러한 필드 중 하나를 기준으로 정렬된다는 것입니다. 제가 생각해 낸 것은 특정 분야의 범위를 기준으로 선을 잡는 방법입니다.

한 가지 예:

예제 입력은 다음과 같으며 두 번째 필드를 기준으로 정렬됩니다. 그래서 가나다순으로 나열되어 있어요

1234|abcd|3fgbe32
1234|abce|5fasdf3
5678|abcf|t438fjd
9876|abcg|57fshde

내가 얻고 싶은 범위는 "abcd - abcf 범위의 모든 레코드를 다른 파일에 기록하고 싶습니다. 나머지 레코드는 다음과 같습니다.

1234|abcd|3fgbe32
1234|abce|5fasdf33
5678|abcf|t438fjd

처음 시작했을 때 나는 이 문제에 잘못된 방식으로 접근하고 있다고 생각했습니다. 각 줄을 반복하면서 정규식과 비교하여 줄을 확인하여 해당 줄이 필요한지 확인합니다. 하지만 awk와 grep을 사용하는 더 좋은 방법이 있을까요?

답변1

범위 내에 속하는 모든 레코드ABCD-ABCF

단순한해결책:

awk -F'|' '$2~/^abc[d-f]$/' file

산출:

1234|abcd|3fgbe32
1234|abce|5fasdf3
5678|abcf|t438fjd

답변2

다른해결책:

awk -F'|' '{if ($2 == "abcd") { l=1} else if ($2 == "abcg") { l=0} }l' file 

답변3

sed해결책.

범위의 첫 번째 행 앞의 행을 삭제하려면 다음 안내를 따르세요.

cat file | sed '/abcd/Q'

범위의 마지막 행 뒤의 행을 삭제하려면 다음 안내를 따르세요.

cat file | sed -n '/abcf/,$p'

   -n : don't print non-matches
   ,$ : first match to end of file
   p  : print

함께 넣어:

cat file | sed '/abcd/Q | sed -n '/abcf/,$p'

이러한 패턴은 행의 모든 ​​필드와 일치하므로 두 번째 필드에만 일치하는 더 나은 패턴이 필요합니다.

cat file | sed -r -n '/^[^\|]+\|abcd/,$p' | sed -r '/^[^\|]+\|abce/Q'

sed를 사용하는 매우 간단한 범위는 다음과 같습니다.

cat file | sed -n '/abc[def]/p'

답변4

sed에서 까지의 범위를 이름이 지정된 파일 abcd에 기록 하고 나머지 줄은 stdout에 전달하는 올인원 솔루션입니다. 따라서 파일을 두 번 검토할 필요가 없습니다.abcfother

sed -e '/|abcd|/,/|abcf|/{wother' -e 'd;}'

관련 정보