减少分隔文本文件中特定列的长度

减少分隔文本文件中特定列的长度

我需要将分隔文本文件中的第 5 列减少到仅前 5 个字符。所有其他列必须保持未编辑状态。

输入:

file1.txt    column1      column2      column3     column4      column5
123456789    123456789    123456789   123456789    123456789

我希望输出看起来像:

output.txt    column1      column2      column3     column4      column5
123456789    123456789    123456789   123456789    12345

注意:我碰巧使用逗号作为分隔符。

答案1

如果file.csv看起来像这样:

123456789,123456789,123456789,123456789,123456789
123456789,123456789,123456789,123456789,223456789
123456789,123456789,123456789,123456789,323456789
123456789,123456789,123456789,123456789,423456789

然后,你可以这样做:

$ awk -F, '{print $1","$2","$3","$4","substr($5,1,5) }' file.csv
123456789,123456789,123456789,123456789,12345
123456789,123456789,123456789,123456789,22345
123456789,123456789,123456789,123456789,32345
123456789,123456789,123456789,123456789,42345

答案2

如果所有值都很简单(值中没有引号和换行符)并且它们以逗号分隔,例如:

123456789,123456789,123456789,123456789,123456789

如果一行中始终有 5 个这样的值,则可以使用sed

sed '2,$s/\(.*\),\(.*\),\(.*\),\(.*\),\(.....\)\(.*\)/\1,\2,\3,\4,\5/' input

假设2,$您有一个以逗号分隔的标题(并且其第五列不应被截断),如果不是这种情况,请将其忽略。

答案3

或者awk

对于空格分隔:

awk 'NR==1 { print; next} {print $1, $2, $3, $4, substr($5,1,5)}'

对于逗号分隔:

awk 'BEGIN {FS=","} NR==1 { print; next} {print $1, $2, $3, $4, substr($5,1,5)}'

对于稍微更好的 CSV 分割并假设 GNU awk:

awk -vFPAT='[^,]*|"[^"]*"'  'NR==1 { print; next} {print $1, $2, $3, $4, substr($5,1,5)}'

相关内容