![awk sed if 문](https://linux55.com/image/110080/awk%20sed%20if%20%EB%AC%B8.png)
줄의 두 번째 문자에 "."가 있으면 처음에 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를 인쇄한 .
다음 두 번째 캡처 그룹(줄의 나머지 부분)을 인쇄합니다.