awk:基于正则表达式打印

时间:2014-10-23 13:55:27

标签: awk sed

这是我的file.txt

KJKJJ1KLJKJKJ928482711|PIEJHHKIA|87166188177633|AJHHHH77760|00666667|876876800874|2014100898798789979879877770

我想修改字段$72014100898798789979879877770)并仅提取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

6 个答案:

答案 0 :(得分:4)

用awk尝试这个衬垫:

awk -F'|' '{print substr($7,7,2) substr($7,5,2) substr($7,1,4) "000000"}' myfile.txt

答案 1 :(得分:1)

我会使用一些bashdate来转换日期:

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'