Ala*_*key 5 sed awk text-processing
我有一大堆文件,其中包含几个以管道分隔的字段。
5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126| 1212121212121212121212121212 |2|0|1000|70|33107||1|事件 5595340959340|1|MXPYAQWE|870569689456950465216|10|812 2323232323232323232323232323 |2|0|1000|70|33107||1|事件 5595340959340|1|MXPYAQWE|870569689456950465216|10|210 3434343434343434343434343434 |2|0|1000|70|33107||1|事件 5595340959340|1|MXPYAQWE|870569689456950465216|10|210 4545454545454545454545454545 |2|0|1000|70|33107||1|事件5595340959340|1|MXPYAQWE|870569689456950465216|10|210 5656565656565656565656565656 |2|0|1000|70|33107||1|事件
注意第八个字段。它目前有 29 个字符,我应该修剪它,所以它只剩下五个字符了。
我想出的唯一(令人费解的)解决方案是:
隔离我要修剪的字段:
awk -F "|" '{print $8}' > Original_Fields
Run Code Online (Sandbox Code Playgroud)
修剪字段
cp Original_Fields Temp
more Temp | cut -c -5 > Trimmed_Fields
Run Code Online (Sandbox Code Playgroud)
用 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!
Run Code Online (Sandbox Code Playgroud)
然后编辑 Original_Fields 和 Trimmed_Fields 文件,所以我最终得到
grep -rl /path/to/file | xargs sed -i 's/Original_Field/Trimmed_Field/g'
Run Code Online (Sandbox Code Playgroud)
这有效,但我强烈怀疑必须有一种更快的方法来使用 AWK 和 SED 来完成此操作,因此我只需一步即可完成所有这些操作。
Ste*_*itt 12
是的,您可以使用 AWK 修剪和重建每一行:
awk -F'|' 'BEGIN { OFS = FS } { $8 = substr($8, 1, 5); print }'
Run Code Online (Sandbox Code Playgroud)
这将输入和输出分隔符设置为“|”,并且对于每一行输入,将第八个字段修剪为最多五个字符,并打印所有字段(包括更新的字段)。