我有一大堆文件,其中包含多个用管道分隔的字段。
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