awk sed if 문


9

"."가 있으면 시작 부분에 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

답변:


12

우리는 중 하나 사용할 수 있습니다 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

무엇에 들어가는 것은 { ... }앞에 추가하는 것이 코드 $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)


1
+1 마지막 AWK 예제 또는 sed 예제가 올바른 방법입니다. 명확성을 위해, 그것은 단지 하나 또는 다른 것임을 유의하십시오.
추후 공지가있을 때까지 일시 중지되었습니다.

제 생각에는 "올바른"접근법 (공백이없고 무게가 가벼움)이 최종 버전 sed 's/^.\./0&/' file.txt입니다. 이 답변의 시작 부분에 넣어야한다고 생각합니다. 여전히 +1입니다.
와일드 카드

1
@Wildcard 우리는 기쁘게 목표합니다.
Kusalananda

5

sed로 :

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

이 패턴 /^.\./은 줄의 시작 부분에서 모든 문자와 리터럴 점을 찾고 ^, 일치하면 줄의 시작 부분을 s0으로 대체하여 시작 부분에 0을 효과적으로 추가합니다.

sed expressoin s/.\{0\}/0/은 다소 이상하며 0 개 이상의 사본과 일치하며 0으로 대체됩니다. 물론 패턴은 문자열의 모든 위치에서 일치하지만 s///첫 번째 일치 만 대체하므로 의도 한대로 작동합니다. 그래도 기발한 방법입니다.


또는 awk를 사용하면 비슷한 정규 표현식이 줄에 일치하지만 다음을 사용할 수 있습니다 substr.

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

먼저 두 번째 문자가 점인지 테스트 한 다음 줄 앞에 0을 추가합니다. 마지막 작업은 수정 후 줄을 인쇄하는 기본 작업을 호출합니다.


4

당신은 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특정 의지 제로 패드의 달, 당신이하려고하는 것처럼 보이는이다.

Kusalananda가 지적한 것처럼 :

더 컴팩트 한 (GNU 날짜 및 배쉬) : date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'


2
좋은 캐치! 더 컴팩트 한 (GNU 날짜와 배쉬) :date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
Kusalananda

패턴에 슬래시가 있지만 파이프가없는 경우 : s|\.|/|g. 그렇지 않으면 위에서 언급했듯이 Nice catch, +1
Alex Stragies

2

다른 답변에서 제시된 것과 다른 전략 : "."을 사용할 수 있습니다. 필드 구분자로.

awk -F. '$1 < 10 {printf "0"} {print}' /tmp/in.txt

당신은 이것을 골프 할 수 있습니다 :

awk -F. '$1<10{printf "0"}1' /tmp/in.txt

sed의 경우 다른 명령에 대한 짧은 명령이 있습니다.


1
대안 : awk -F. '{print ($1<10?0$0:$0)}' file
조지 Vasiliou

1

sed를 사용하면

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

이것은 ^줄의 시작 부분에 고정한 다음 그룹에서 단일 문자를 캡처 .한 다음 리터럴을 붙인 다음 다른 것을 사용합니다. 우리가 일치하는 것을 인쇄하면 0첫 번째 캡처 그룹 (줄의 시작 부분에있는 문자), .두 번째 캡처 그룹 (줄의 나머지 부분)


캡처를 수행 할 필요는 없습니다. &당신의 친구입니다. Kusalananda의 sed 예제를 참조하십시오.
추후 공지가있을 때까지 일시 중지되었습니다.

@DennisWilliamson은 필요하지 않지만, 이미 다른 예가 있다면 sed이것은이 특정한 문제뿐만 아니라 다른 상황에서도 유용 할 수있는 또 다른 기능을 보여줍니다
Eric Renouf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.