我有一个以下形式的文件:
Firstname LastName; 123-4567; Job Title
Firstname LastName; 123-4567; Job Title
Firstname LastName; 123-4567; Job Title
...
我正在尝试使用awk将文件解析为makedbm可读的表单(以制作自定义NIS映射)。字段分隔符是分号。我需要能够从每行的每个字段中删除所有前导空格,但在名称字段和标题字段中留下空格。感谢。
答案 0 :(得分:5)
如果您想删除 leading space from all fields
并保留 space in between the Names and Job title fields
,那么您可以执行以下操作 -
awk -F";" -v OFS=";" '{for (i=1;i<=NF;i++) gsub (/^ */,"",$i);print}' INPUT_FILE
<强>测试强>
[jaypal:~/Temp] cat file
Firstname LastName; 123-4567; Job Title
Firstname LastName; 123-4567; Job Title
Firstname LastName; 123-4567; Job Title
[jaypal:~/Temp] awk -F";" -v OFS=";" '{for (i=1;i<=NF;i++) gsub (/^ */,"",$i);print}' file
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
答案 1 :(得分:3)
使用sed
:
sed 's/^ *//; s/; */;/g'
这假设您的所有空格都只是空格字符。要包含所有空格字符,请查看POSIX character classes, viz :
sed 's/^[[:space:]]*//; s/;[[:space:]]*/;/g'
% echo 'Firstname LastName; 123-4567; Job Title
Firstname LastName; 123-4567; Job Title
Firstname LastName; 123-4567; Job Title' | sed 's/^[[:space:]]*//; s/;[[:space:]]*/;/g'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
如果您的sed
版本不支持使用分号分隔语句,则可以使用-e
发出单独的命令:
% echo 'Firstname LastName; 123-4567; Job Title
Firstname LastName; 123-4567; Job Title
Firstname LastName; 123-4567; Job Title' | sed -e 's/^[[:space:]]*//' -e 's/;[[:space:]]*/;/g'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
答案 2 :(得分:1)
只需在您的字段编号上执行gsub,例如:
gsub (/^ */, "", $1);
这将取代所有领先的空间,而所有其他空间保持不变。 gsub
函数使用指定变量的新值对给定模式进行全局替换。
在这种情况下,模式为^ *
,表示字符串的开头后跟零个或多个空格。替换模式是一个空字符串,正在操作的变量是行中的第一个字段$1
。
以下脚本显示了此操作,对于行中的所有列,由i
变量控制。 NF
是当前行中的字段数,$i
是指i
位置的字段。
$ cat file | awk -F\; -vOFS=\; '{
for (i = 1; i <= NF; i++) {
gsub (/^ */, "", $i);
};
print}'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
答案 3 :(得分:1)
很多方法可以实现您的目标。
只需添加一个以获得乐趣:
awk -v OFS=";" -F'; *' '{gsub(/^ */,"")}$1=$1' file
更短:
awk -v OFS=";" -F'; *' 'gsub(/^ */,"", $1)' file
<强>测试强>
kent$ echo "Firstname LastName; 123-4567; Job Title
Firstname LastName; 123-4567; Job Title
Firstname LastName; 123-4567; Job Title
"|awk -v OFS=";" -F'; *' '{gsub(/^ */,"")}$1=$1'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
kent$ echo "Firstname LastName; 123-4567; Job Title
Firstname LastName; 123-4567; Job Title
Firstname LastName; 123-4567; Job Title
"|awk -v OFS=";" -F'; *' 'gsub(/^ */,"",$1)'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
答案 4 :(得分:0)
试试这个
{
gsub("; *",";")
gsub("^ *","")
print
}