awk sed if 문

awk sed if 문

줄의 두 번째 문자에 "."가 있으면 처음에 0을 추가하려고 합니다. 나는 그 둘을 결합할 수 없었다.

awk '{ print substr( $0, 2, 1 ) }' file.txt 

두 번째 문자 표시

sed -ie "s/.\{0\}/0/" file.txt

처음에 0을 추가하세요.

"두 번째 문자가 점인 경우"가 있어야 합니다.

샘플 파일:

1.02.2017 23:40:00
10.02.2017 23:40:00

결정적인:

01.02.2017 23:40:00
10.02.2017 23:40:00

답변1

우리는 문제를 완전히 해결하기 위해 sed또는 중 하나를 사용할 수 있습니다 .awk


그리고 sed:

$ sed 's/^.\./0&/' file.txt

&바꾸기 명령( )의 바꾸기 부분 에 있는 경우 s명령의 패턴 부분과 일치하는 입력 줄 부분까지 확장됩니다.

정규식 ^.\.은 "^( )로 시작하고 문자( .) 뒤에 리터럴 점( \.) 이 오는 모든 행과 일치합니다.".

행이 이면 1.02.2017 23:40:00패턴이 일치하고 1.행의 시작 부분에서 대체됩니다.01.


그리고 awk:

awk질문의 코드 부분을 기반으로 ...

위에서 언급한 대로 각 줄에 입력된 두 번째 문자가 인쇄됩니다.

$ awk '{ print substr($0, 2, 1) }' file.txt

두 번째 문자가 반환된다는 사실을 substr($0, 2, 1)조건으로 사용할 수 있습니다.

$ awk 'substr($0, 2, 1) == "." { ... }' file.txt

이전 조건이 true인 경우 현재 줄의 내용 앞에 0을 추가하는 코드를 입력합니다 { ... }.$0

$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt

그런 다음 모든 줄이 인쇄되었는지 확인하면 됩니다.

$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt

물론 조건을 substr($0, 2, 1) == "."정규식으로 변경할 수도 있습니다( sed솔루션에서 사용한 것과 정확히 동일한 것을 사용합니다).

$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt

"짧을수록 좋다"고 생각하는 일부 사람들은 다음과 같이 쓸 것입니다.

$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt

(그리고 아마도 대부분의 공백도 제거되었을 것입니다 awk '/^.\./{$0="0"$0}1' file.txt.)

답변2

sed를 사용하세요:

sed -e "/^.\./s/^/0/" file.txt 

이 패턴은 /^.\./줄 시작 부분에서 모든 문자와 리터럴 포인트를 찾고 ^, 일치하는 경우 s줄 시작 부분을 0으로 대체하여 효과적으로 시작 부분에 0을 추가합니다.

sed 표현식은 s/.\{0\}/0/약간 이상합니다. 0개 이상의 복사본과 일치하고 이를 0으로 바꿉니다. 물론 패턴은 문자열의 모든 위치와 일치하지만 s///첫 번째 항목만 대체되므로 예상대로 작동합니다. 하지만 이것은 이상한 접근 방식입니다.


또는 awk를 사용하면 유사한 정규식이 해당 행과 일치하지만 다음을 사용할 수 있습니다 substr.

awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt 

먼저 두 번째 문자가 점인지 테스트하고, 그렇다면 줄 앞에 0을 추가합니다. 마지막 것은 수정 후 행을 인쇄하는 기본 동작을 호출합니다.

답변3

당신은 awk와 sed에 대해 이야기하고 있지만 날짜 형식을 지정하려는 것 같습니다. 이에 대해 해당 date명령을 사용합니다. 예를 들어:

echo '1.2.2017 23:40:00' | sed 's/\./\//g' | xargs -0 date '+%m.%d.%Y %T' -d

출력됩니다

01.02.2017 23:40:00

sed중간에 있는 명령은 에 입력할 마침표를 슬래시로 변경합니다 date -d. 형식 옵션을 사용하면 원하는 거의 모든 형식으로 출력할 수 있습니다. 특히 %m월은 0으로 채워질 것이며 이는 여러분이 원하는 것으로 보입니다.

Kusarananda가 지적했듯이:

더 간결함(GNU 날짜 및 Bash):date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'

답변4

sed를 사용하면 그럴 수도 있습니다.

sed 's/^\(.\)\.\(.*\)/0\1.\2/'

^이는 줄의 시작 부분에 고정한 다음 그룹의 단일 문자, 텍스트 .및 기타 항목 을 캡처하는 데 사용됩니다 . 일치하면 a를 인쇄하고 0첫 번째 캡처 그룹(줄 시작 부분의 문자)을 인쇄한 다음 a를 인쇄한 .다음 두 번째 캡처 그룹(줄의 나머지 부분)을 인쇄합니다.

관련 정보