这是我的file.txt
KJKJJ1KLJKJKJ928482711|PIEJHHKIA|87166188177633|AJHHHH77760|00666667|876876800874|2014100898798789979879877770
我想修改字段$7
(2014100898798789979879877770
)并仅提取8个第一个字符(20141008
)并将其更改为08102014
,这是日期。然后,将它们与000000
连接起来:$ 7的输出应为08102014000000
。
这是我的代码,但它会更改第一个字段$ 1,我希望它更改字段$7
:
sed 's~^\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)[^\|]*~\3\2\1000000~' file.txt > other-file.txt
答案 0 :(得分:4)
用awk尝试这个衬垫:
awk -F'|' '{print substr($7,7,2) substr($7,5,2) substr($7,1,4) "000000"}' myfile.txt
答案 1 :(得分:1)
我会使用一些bash
和date
来转换日期:
while IFS="|" read -r v1 v2 v3 v4 v5 v6 var
do
new=$(date -d"${var:0:8}" "+%d%m%Y")000000
printf "%s|%s|%s|%s|%s|%s|%s\n" $v1 $v2 $v3 $v4 $v5 $v6 $new
done < file
$ while IFS="|" read -r v1 v2 v3 v4 v5 v6 var; do new=$(date -d"${var:0:8}" "+%d%m%Y")000000; printf "%s|%s|%s|%s|%s|%s|%s\n" $v1 $v2 $v3 $v4 $v5 $v6 $new; done < a
KJKJJ1KLJKJKJ928482711|PIEJHHKIA|87166188177633|AJHHHH77760|00666667|876876800874|08102014000000
答案 2 :(得分:1)
如果您gawk
尝试
awk '{$NF=gensub(/(....)(..)(..)(.*)/,"\\3\\2\\1000000","g",$NF)}1' OFS='|' FS='|' file
答案 3 :(得分:1)
如果你有Gnu awk,你可以使用gensub()
函数:
awk -F'|' -v OFS="|" '{$7=gensub(/(....)(..)(..).*/,"\\3\\2\\1000000","g",$7)}7' file
以您的示例输出:
KJKJJ1KLJKJKJ928482711|PIEJHHKIA|87166188177633|AJHHHH77760|00666667|876876800874|08102014000000
答案 4 :(得分:0)
Perl解决方案:
perl -aF'\|' -lne 'print join "|", @F[ 0 .. 5 ],
substr($F[6], 6, 2) . substr ($F[6], 4, 2) . substr($F[6], 0, 4) . 0 x 6;'
要正确处理日期,您可以使用Time::Piece
:
perl -MTime::Piece -aF'\|' \
-lne 'print join "|", @F[0..5],
Time::Piece->strptime(substr($F[6], 0, 8), "%Y%m%d")->dmy(q()) . 0 x 6;'
答案 5 :(得分:0)
像这样的awk和sed的组合:
awk 'BEGIN{FS="|"}{print $7}' file | sed -n 's/\(.\{4\}\)\(.\{2\}\)\(.\{2\}\).*/\3\2\1000000/p'