Awk 编辑当前文件并从编辑的行中读取

Awk 编辑当前文件并从编辑的行中读取,awk,gawk,Awk,Gawk,我是AWK/sed的新手。我正在读一个文件,看起来像下面这样,但它相当大,大约有1500条记录。另外,我将在多个此类文件上使用此脚本: Der263849500 Glazed glazed.xyz14@zyx.com Cds274849540 Trover trover.xyz12@zyx.com Abd 246738209 Sigma Sigma.xyz13@zyx.com 如果您注意到,第三条记录在第一个字段和第二个字段之间有一个空格。我想在文件中更正那个特殊的记录。此外,在线路矫正后,A

我是AWK/sed的新手。我正在读一个文件,看起来像下面这样,但它相当大,大约有1500条记录。另外,我将在多个此类文件上使用此脚本:

Der263849500 Glazed glazed.xyz14@zyx.com
Cds274849540 Trover trover.xyz12@zyx.com
Abd 246738209 Sigma Sigma.xyz13@zyx.com
如果您注意到,第三条记录在第一个字段和第二个字段之间有一个空格。我想在文件中更正那个特殊的记录。此外,在线路矫正后,AWK代码应再次处理矫正后的线路。下面是我尝试过的代码-

#! /usr/bin/awk -f

BEGIN {
    edited=0
}
{
    if (match($1,"[A-Z][a-z][a-z]$")!=0) {
        temp = $1 $2
        newLine = temp
        for (i = 3; i <= NF; i++) {
                if ($i != "") {
                    newLine = newLine " " $i
                }
            }
        print newLine
        FILRNAME[FNR]=newLine
        NR=NR-1
        edited=edited+1
    }
}
END {
    print "The number of lines edited is " edited
}
#/usr/bin/awk-f
开始{
编辑=0
}
{
如果(匹配($1,“[A-Z][A-Z][A-Z]$”))=0){
临时工=$1$2
换行符=临时

对于(i=3;i如果要更改文件

awk 'some commands' inputfile > tmp & mv tmp inputfile
这将用新内容替换源文件



-i
将写回原始文件。

您可以使用sed命令在同一文件中使用以下命令进行更改:

sed -i '/^[A-Za-z]*[[:space:]]/ {s/\(.*\) \(.*\) \(.*\) \(.*\)/\1\2 \3 \4/g}' filename

您可以编写脚本来查找文件中更改的记录数。

不,我不想更改文件。给出的示例是一个示例。但实际文件很大。每个文件可能需要多次这样的更正。因此,更改文件可能无法扩展。我确实阅读了此
,上面的代码按照我的意愿打印了行它可以读取,但没有对正在读取的文件进行任何更改。
并回答如何更改文件。'FILRNAME[FNR]=newLine”-这一行应该将编辑过的记录写回文件中。或者这就是我正在尝试做的。你不能写回你正在阅读的同一个文件。你需要通过一个临时文件,然后将其存储回原始文件。没有其他方法吗?即使使用sed也不行?你能给出一个数字来估计我看到的文件有多大吗您是否也可以在编辑后重新处理每一行来评论您希望完成的工作?如果有3个以上的字段,是否要将更多的前导字段连接在一起?
sed -i '/^[A-Za-z]*[[:space:]]/ {s/\(.*\) \(.*\) \(.*\) \(.*\)/\1\2 \3 \4/g}' filename