这是我的问题。我有几百个文件太大,无法使用vi编辑器进行编辑。我正在寻找可能的awk或sed命令来操纵我的文件。有点新秀。我有一个简化的文件:
001|1|3|053412|16|1234|||
001|21|4|123618|15|88|||
创建了文件,第四个字段格式错误。
第四场应该是05:34:12反映HH:MM:SS。时间值是正确的,我只需要在适当的位置插入:
。
如何在第四个字段后面插入冒号,在第四个字段中插入第四个字符?我不能通过字符计数来完成它,因为第四个字段之前和之后的值是可变的。
答案 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个字段。