我需要将分隔文本文件中的第 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)}'