awk sed if 문 수 없었다. awk

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



답변

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


답변

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을 추가합니다. 마지막 작업은 수정 후 줄을 인쇄하는 기본 작업을 호출합니다.


답변

당신은 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'


답변

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

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

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

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

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


답변

sed를 사용하면

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

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


답변