减少文本处理中文件的过度使用

Ram*_*esh 5 sed awk

目前,我有一个Results.txt包含 27k 行的文件 ( )。文件内容如下。

45008657        |       A.      |               |       Long    |       0
49210987        |       A.      |               |       Steven  |       3262
49600694        |       A.      |               |       Steven    |       4772
467814  |       A.      |       Rafeal    |       Nadal|       4133
53111047        |       A.      |       Mike    |       Tyson  |       13484
Run Code Online (Sandbox Code Playgroud)

我需要删除多余的空格,如下所示。

cat Results.txt | tr -d " \t\r" > Results1.txt
Run Code Online (Sandbox Code Playgroud)

文件 ( Results1.txt) 格式整齐,没有多余的空格。

45008657|A.||Long|0
49210987|A.||Steven|3262
49600694|A.||Steven|4772
467814|A.|Rafeal|Nadal|4133
53111047|A.|Mike|Tyson|13484
Run Code Online (Sandbox Code Playgroud)

现在,我需要将所有字母转换为小写,并将第 2 列附加到第 4 列。

awk 'BEGIN { FS = "|" } ; { print $1"|"tolower($2) tolower($3) tolower($4)"|"$5 }' Results1.txt > Results2.txt
Run Code Online (Sandbox Code Playgroud)

我的Results2.txt文件将如下所示。

45008657|a.long|0
49210987|a.steven|3262
49600694|a.steven|4772
467814|a.rafealnadal|4133
53111047|a.miketyson|13484
Run Code Online (Sandbox Code Playgroud)

有什么办法可以在我的初始文件 ( Results.txt) 本身中完成上述所有步骤?我想减少文件的过度使用,以便在后期阶段进行调试。

编辑:我只是不想在创建一个新文件后删除这些文件,这对我来说似乎不是一个优雅的解决方案。

Sté*_*las 10

使用 GNU sed

sed -i 's/\s//g;s/\(|[^|]*\)|\([^|]*\)|/\1\2/;s/.*/\L&/' Results.txt
Run Code Online (Sandbox Code Playgroud)


dev*_*ull 7

确实,您不需要临时文件。

awk -F'|' '{gsub("[ \t\r]", "", $0)}{print $1,tolower($2$3$4),$5}' OFS='|' inputfile
Run Code Online (Sandbox Code Playgroud)

表达式的第一部分执行您使用tr. 第二部分组合字段 2-4 并将它们小写并与其他两个字段一起打印。

对于您的输入,它会产生:

45008657|a.long|0
49210987|a.steven|3262
49600694|a.steven|4772
467814|a.rafealnadal|4133
53111047|a.miketyson|13484
Run Code Online (Sandbox Code Playgroud)

GNU awk 4.1.0 及更高版本支持就地编辑。你可以说:

awk -i inplace -F'|' '{gsub("[ \t\r]", "", $0)}{print $1,tolower($2$3$4),$5}' OFS='|' inputfile
Run Code Online (Sandbox Code Playgroud)