다음과 같이 "|"로 구분된 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"
코스타스가 말했듯이
당신을 도와야합니다.
추신. 죄송합니다. 분할에 이중 대시를 사용하지 않는 것 같습니다. 생각해보자...