파일의 빈 열(필드) 위치에 현재 날짜를 삽입합니다.

파일의 빈 열(필드) 위치에 현재 날짜를 삽입합니다.

다음과 같이 "|"로 구분된 4개의 열이 있는 파일이 있습니다.

23414|test doc for me||
32322|test doc for you|2004_12_03|
13454|test doc for all||2010_11_01

출력이 다음과 같이 나타나도록 현재 시스템 날짜를 빈 열에 삽입하려고 합니다.

23414|test doc for me|2018_04_03|2018_04_03
32322|test doc for you|2004_12_03|2018_04_03
13454|test doc for all|2018_04_03|2010_11_01

아래는 내가 시도한 코드입니다

for file in `ls -rlt Added_to_* | awk '{print $9}'`
do
  now="$(date +'%Y/%m/%d')"
  echo "Running for: $file"
  awk -F'|' -v curr="$now" '{ 
    if( $3=="" || $4=="" ){ 
     if ( $3=="" ) { print "$curr"}
     if ( $4=="" ) { print "$curr"}
  }else  
     do_something ; 
  }' $file 
done

답변1

첫째, 파일 목록을 읽고 처리할 수 있으므로 출력을 전혀 구문 분석 ls하거나 쉘 루프를 사용할 필요가 없습니다 .awk

$curr또 다른 문제는 전달된 변수 를 참조 하는 방식입니다 curr.$curr필드 번호 curr- 그런 일이 있었다면). 또한 필드가 비어 있는지 여부를 두 번 테스트할 필요가 없습니다.

그래서

awk -v curr="$now" '
  BEGIN{OFS=FS="|";} {for(i=3;i<=4;i++) {if ($i=="") $i=curr}} {print}
' Added_to_*

답변2

우리는 대체가 발생하는 POI(관심 위치)에 초점을 맞추기 위해 Lookbehind/lookahead 정규식을 사용합니다. 그런 다음 Perl's내장 함수를 사용하여 현재 날짜를 배치합니다 localtime. 세 번째, 네 번째, 다섯 번째 필드는 오늘 날짜를 가져오는 데 필요한 상수를 추가하는 일/월/년 정보입니다. 연도에 1 1900, 월에 1, 일에 0을 더합니다.

perl -ple 's/\|\K(?=\||$)/join "_", map $_ + qw[1900 1 0][$a++%3], (localtime)[5,4,3]/eg'

답변3

sed ":a;s/|\(|\|$\)/|$(date +%Y_%m_%d)\1/;ta"

코스타스가 말했듯이

당신을 도와야합니다.

추신. 죄송합니다. 분할에 이중 대시를 사용하지 않는 것 같습니다. 생각해보자...

관련 정보