2014-03-31 2 views
2

15 분마다 데이터가 저장되는 디렉토리를 나열하는 수천 개의 라인 파일이 있습니다. 각 디렉토리의 이름은 00, 15, 30 또는 45로 끝나는 시간 소인입니다.awk를 사용하여 행의 누락 된 필드를 찾습니다.

이 파일에는 15 분 간격의 각 시간 소인이 들어 있습니다. 예를 들어,

io_credit 2014030100 00 15 30 45 
io_credit 2014030101 15 30 
io_credit 2014030102 45 
io_credit 2014030103 00 15 30 45 

일부 타임 스탬프에는 일정한 15 분 간격이 없습니다. 타임 스탬프가없는 경우에도 타임 스탬프가 기록되는 순서는 항상 동일합니다. 따라서 15만이 누락 된 시간 소인이면 00, 30 및 45가 순서대로 표시됩니다. Sames는 다른 모든 타임 스탬프에도 적용됩니다. 즉 당신은 내가 밖으로 인쇄 각 타임 스탬프를 몇 가지 방법을 알아 내기 위해 AWK 고민했습니다과 그 타임 스탬프 간격 (들)없는

45 15 30 

같은 것을 볼 수 없을거야 그래서. 다음은

는 난 단지 5 개의 필드를 포함하는 행을 위해 작성한 것입니다 :

cat file | awk '{if (NF == 5) for (i = 3; i <= 5; i++) { if (i == 3 && $i == "00") continue; else if (i == 3 && $i == "15") missing="00"; continue; if (i == 4 && $i == "15") continue; else if (i == 4 && $i == "30") missing=missing " 15"; if (i == 5 && $i == "30") missing=missing "45"; else missing=missing "30"; } {print $1,$2, missing }}' 

그러나이 경우에만 인쇄 "00"및 (NF의 == 5) 규정과 일치하는 모든 행에 대해 아무것도.

내가 뭘 잘못하고 있니?

+0

모든 데이터가 동일하게 보이도록하려면 논리의 이점은 무엇입니까? 그냥'awk '{print $ 1 ""$ 2 "00 15 30 45"}'file' 행운을 빈다. – shellter

+0

아니요, 누락 된 기간에만 다른 위치의 데이터를 복사해야합니다. 그래서 각 타임 스탬프마다 누락 된 간격 목록이 필요합니다. 00, 15 및 45가 해당 타임 스탬프에있는 경우 전체 4 개가 아니라 30 개만 복사하려고합니다. – user3481957

+0

설명과 코드에서 (최소한) 명확하지 않습니다. 샘플 입력에서 예상되는 출력으로 질문을 업데이트 할 수 있습니까? 행운을 빕니다. – shellter

답변

1

다음은 파일의 각 행을 보여줍니다. 행에 모든 시간 소인이 있으면 무시됩니다. 그렇지 않은 경우, 누락 된 타임 스탬프가 인쇄됩니다 작동 원리

$ awk 'NF==6 {next} {c="00 15 30 45"; for(i=3;i<=NF;i++){sub($i," ",c)}; print $2" " c} ' file 
2014030101 00  45 
2014030102 00 15 30 

을 모든 타임 스탬프는 한 줄에 존재 경우 해당 라인은 6 개 필드가 있습니다. 6 개의 필드가있는 모든 좋아요 (NF==6)는 무시됩니다. 그렇지 않으면 변수 c"00 15 30 45"으로 설정됩니다. 그런 다음 코드는 각 타임 스탬프를 반복하며 c에서 해당 타임 스탬프를 제거합니다. 타임 스탬프와 무엇이든지 c (누락 된 필드가 됨)에 인쇄됩니다.

+0

고마워, 나는 그게 올바른 접근이지만 내 뇌가 막힌 뒷 골목으로 계속 가고 있다는 것을 알았다. – user3481957

관련 문제