将字符插入大文件中的指定字段

时间:2016-07-14 18:49:54

标签: awk sed

这是我的问题。我有几百个文件太大,无法使用vi编辑器进行编辑。我正在寻找可能的awk或sed命令来操纵我的文件。有点新秀。我有一个简化的文件:

001|1|3|053412|16|1234|||
001|21|4|123618|15|88|||

创建了文件,第四个字段格式错误。 第四场应该是05:34:12反映HH:MM:SS。时间值是正确的,我只需要在适当的位置插入:

如何在第四个字段后面插入冒号,在第四个字段中插入第四个字符?我不能通过字符计数来完成它,因为第四个字段之前和之后的值是可变的。

5 个答案:

答案 0 :(得分:1)

gawk救援!

$ awk -F\| -v OFS=\| '{$4=gensub(/(..)(..)(..)/,"\\1:\\2:\\3","g",$4)}1' file

001|1|3|05:34:12|16|1234|||
001|21|4|12:36:18|15|88|||

否则您可以对substr($4,1,2)":"...

执行相同的操作

答案 1 :(得分:1)

使用GNU awk进行gensub()和就地编辑

awk -i inplace 'BEGIN{FS=OFS="|"} {$4=gensub(/(..)(..)/,"\\1:\\2:",1,$4)} 1' *

与ERE和内部编辑的GNU sed类似:

sed -i -E 's/(([^|]*\|){3}..)(..)/\1:\3:/' *

e.g:

$ awk 'BEGIN{FS=OFS="|"} {$4=gensub(/(..)(..)/,"\\1:\\2:",1,$4)} 1' file
001|1|3|05:34:12|16|1234|||
001|21|4|12:36:18|15|88|||

$ sed -E 's/(([^|]*\|){3}..)(..)/\1:\3:/' file
001|1|3|05:34:12|16|1234|||
001|21|4|12:36:18|15|88|||

答案 2 :(得分:0)

使用sed:

$ sed -r 's/([^|]*|[^|]*|[^|]*|)([0-9]{2})([0-9]{2})([0-9]{2})/\1\2:\3:\4/' file
001|1|3|05:34:12|16|1234|||
001|21|4|12:36:18|15|88|||

答案 3 :(得分:0)

试试这个awk!

awk -F"|" -v OFS="|" '{r=split($4,T,"");for(i=2;i<=r;i+=2){if(i!=r)T[i]=T[i]":"}tmp="";for(i=1;i<=r;i++){tmp=tmp T[i]}$4=tmp;}1' file

001|1|3|05:34:12|16|1234|||
001|21|4|12:36:18|15|88|||

更长的白衣解释:

BEGIN{
FS=OFS="|"; #Field separator and output field separator
}
{
    tmp="";
    r=split($4,time_field,""); # Chunk field into pieces
    for(i=2;i<=r;i+=2) # Loop two by two
    {
        if(i!=r)
        {
            time_field[i]=time_field[i]":"; # Add ":"
        }
    }

    for(i=1;i<=r;i++) # Loop over again to rebuild
    {
        tmp=tmp time_field[i];
    }
    $4=tmp; #rebuid field
    print
}

How you could use it in bash: Save it as whatever.awk

while IFS='' read -r file
do
awk -f whatever.awk "$file" > out_file
done < list_of_files_to_edit.txt

如果要编辑文件,可以将选项-i添加到Kenavoz sed命令。 sed -ri ...

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/^(([^|]*\|){3})(..)(..)/\1\3:\4:/' file

使用反向引用对前三个字段和以下两个字段进行分组。然后根据需要格式化第4个字段。