使用 awk/sed 将字段切割为一定长度

使用 awk/sed 将字段切割为一定长度

我有一大堆文件,其中包含多个用管道分隔的字段。

5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|1212121212121212121212121212|2|0|1000|70|33107||1|事件 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|2323232323232323232323232323|2|0|1000|70|33107||1|事件 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|3434343434343434343434343434|2|0|1000|70|33107||1|事件 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|4545454545454545454545454545|2|0|1000|70|33107||1|事件 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|5656565656565656565656565656|2|0|1000|70|33107||1|事件

注意第八个字段。它目前有 29 个字符,我应该对其进行修剪,使其只剩下 5 个字符。

我想出的唯一(复杂的)解决方案是:

隔离我想要修剪的字段:

awk -F "|" '{print $8}' > Original_Fields

修剪字段

cp Original_Fields Temp
more Temp | cut -c -5 > Trimmed_Fields

使用 sed 创建替换脚本

grep -rh -f <file_with_matching_strings> /path/to/files > Original_Strings
vi Original_Strings
:%s/^/grep -rl "/g
:%s/$/" \/path\/to\/file | xargs sed -i 's\//g
:wq!

然后编辑 Original_Fields 和 Trimmed_Fields 文件,所以我最终得到

grep -rl /path/to/file | xargs sed -i 's/Original_Field/Trimmed_Field/g'

这是可行的,但我强烈怀疑必须有一种更快的方法来使用 AWK 和 SED 来完成此任务,因此我只需一步即可完成所有这些工作。

答案1

是的,您可以使用 AWK 修剪和重建每一行:

awk -F'|' 'BEGIN { OFS = FS } { $8 = substr($8, 1, 5); print }'

这将输入和输出分隔符设置为“|”,并且对于每行输入,将第八个字段修剪为最多五个字符,并打印所有字段(包括更新的字段)。

答案2

由于您的文件是固定宽度的 - 或者至少看起来 - 您可以计算 sed 中要保留和丢弃的列数:

sed -r 's/(.{68}).{23}(.*)/\1\2/' yourfile

相关内容