다음 형식의 파일이 있습니다.
"2004-04-19 12:25:57" 44 44
"2004-04-19 13:39:32" 36 36
"2004-04-19 14:00:53" 34 34
2개의 새 파일이 필요합니다.
a) 다음과 같이 파일의 첫 번째 열에 있는 "시간" 값을 1부터 시작하는 숫자로 바꾸는 파일:
1 44 44
2 36 36
3 34 34
b) 다음과 같이 파일의 첫 번째 열에 있는 "시간" 값을 숫자 Unix Tamestamp 데이터로 대체하는 또 다른 파일:
1082377557 44 44
1082381972 36 36
1082383253 34 34
답변1
다음 라이너를 사용할 수 있습니다 bash
.
i=1; while IFS=' ' read a b c; do echo "$i $c" >>foo.txt; ((i+=1)); \
echo "$(date -d "${a#\"} ${b%\"}" '+%s')" "$c" >>bar.txt; done <file.txt
확장된 형태:
i=1
while IFS=' ' read a b c; do
echo "$i $c" >>foo.txt
((i+=1))
echo "$(date -d "${a#\"} ${b%\"}" '+%s')" "$c" >>bar.txt
done <file.txt
실행 후 다음이 foo.txt
표시됩니다.
1 44 44
2 36 36
3 34 34
그리고 다음 bar.txt
을 갖게 됩니다:
1082377557 44 44
1082381972 36 36
1082383253 34 34
답변2
이상한:
awk '{
# store the time value (first 2 words)
timestamp = $1 " " $2
# shift the other fields 2 places (I wish this was simpler in awk)
for (i=3; i<=NF; i++) $(i-2) = $i
NF -= 2
# print to the line-numbers file
print NR, $0 > "file1"
# convert the timestamp and print to that file
gsub(/[-:"]/, " ", timestamp)
print mktime(timestamp), $0 > "file2"
}' file
mktime
GNU awk가 필요합니다(제 생각에는).
진주:
perl -MTime::Piece -anE '
BEGIN {
$, = " ";
open $f1, ">", "file1";
open $f2, ">", "file2"
}
$date = shift @F;
$time = shift @F;
say $f1 $., @F;
say $f2 Time::Piece->strptime("$date $time", "\"%Y-%m-%d %H:%M:%S\"")->epoch, @F
' file
답변3
글쎄, 당신을 위해 숙제를 할 위험이 있습니다. 당신을 위한.
데이터가 YOURFILENAME이라는 파일에 있다고 가정하면 첫 번째 줄 라이너는 줄 번호와 파일의 마지막 두 필드를 추가합니다.
count=1;cut -d" " -f 3,4 YOURFILENAME| while read line ; do echo $count $line;((++count)); done
두 번째 줄은 날짜를 epoch로 변환하고 나머지 줄을 인쇄합니다(따옴표를 제거하기 위해 다른 sed를 추가해야 했지만 빠르고 지저분하게 수행했습니다).
cut -d"\"" -f2 YOURFILENAME| while read line; do SWAP=$(date -d "$line" +\%s); sed -i "s/$line/$SWAP/g" YOURFILENAME;done ; sed 's/"//g' YOURFILENAME
이는 이를 수행할 수 있는 한 가지 방법일 뿐입니다. 꽤 더 있을 수도 있습니다.
답변4
나는 Perl에서 이것을 할 것이다:
#!/usr/bin/env perl
use strict;
use warnings;
use Time::Piece;
#open our files for output
open( my $output1, '>', "output_file_one.txt" ) or die $!;
open( my $output2, '>', "output_file_two.txt" ) or die $!;
#iterate the magic filehandle - <> - which reads either data piped from
#stdin, or opens files specified on command line. (Just like grep/awk/sed)
while (<>) {
#regex match the values out of your source file.
my ( $t, @values ) = m/^\"(.*)\" (\d+) (\d+)/;
#convert $t into a time object.
$t = Time::Piece->strptime( $t, "%Y-%m-%d %H:%M:%S" );
#use the "epoch" method to extract the numeric time from $t
print {$output1} join( " ", $t->epoch, @values );
# $. is the perl special var for current line number.
print {$output2} join( " ", $., @values );
}
close($output1);
close($output2);