使用Awk删除空格

时间:2012-01-07 00:16:35

标签: awk centos nis

我有一个以下形式的文件:

Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title
...

我正在尝试使用awk将文件解析为makedbm可读的表单(以制作自定义NIS映射)。字段分隔符是分号。我需要能够从每行的每个字段中删除所有前导空格,但在名称字段和标题字段中留下空格。感谢。

5 个答案:

答案 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'

演示(在OSX上):

% 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
}