我在一个文件中有以下格式的数据。
name,path:A:B
loc:D
name,for:B:C
我需要添加"(空格+逗号(在所有没有的行的开头,在文件中,以获得如下输出。
name,path:A:B
,loc:D
name,for:B:C
grep "[^,]" file
。。这给了我一个不包含的行列表,但我无法在开头添加。
请您尝试以下内容,用GNUawk
中显示的示例编写和测试。
awk '!/,/{print OFS","$0;next} 1' Input_file
解释:添加以上详细解释。
awk ' ##Starting awk program from here.
!/,/{ ##Checking condition if line is NOT having comma then do following.
print OFS","$0 ##Printing OFS comma and current line here.
next ##next will skip all further statements from here.
}
1 ##1 will print current line here.
' Input_file ##Mentioning Input_file name here.
grep
不是这里的工具,我会使用awk或sed。使用awk:
$ awk '
BEGIN {
FS=OFS="," # set delimiters to ,
}
NF==1 { # if there is only one field (consider NF<=1 for ampty records)
$1=OFS $1 # add a delimiter in front of it
}
1' file # output
输出:
name,path:A:B
,loc:D
name,for:B:C
使用sed:
sed -r '/,/!s/(^.*$)/ ,1/' file
使用搜索没有逗号的行!然后将整行替换为空格、逗号和现有行。
我将使用GNUAWK
执行以下任务,让file.txt
内容为
name,path:A:B
loc:D
name,for:B:C
然后
awk '{print /,/?$0:" ,"$0}' file.txt
输出
name,path:A:B
,loc:D
name,for:B:C
说明:对于每一行,如果有,
,则只有print
那一行($0
(,否则是print
空格逗号(" ,"
(和那一行的串联($0
(。
(在gawk 4.2.1中测试(
您可以使用index
来检查逗号。
awk '{print index($0, ",") ? $0 : " ," $0}' file
输出
name,path:A:B
,loc:D
name,for:B:C
这里有很多使用sed
或awk
的好答案,它们完全可以做到这一点(甚至比下面的更好(。但有趣的是,这里有一个仅限bash
的解决方案(无需调用grep
等外部程序(,它也能起到作用:
$ while read -r; do p=""; [[ ! $REPLY =~ [^,]*,[^,]* ]] && p=" ,"; echo "${p}${REPLY}"; done < test.txt
name,path:A:B
,loc:D
name,for:B:C
解释版本:
#!/bin/bash
while read -r; do # looping over a file the right way in bash
p="" # initializing a prefix
[[ ! $REPLY =~ [^,]*,[^,]* ]] && p=" ," # if the line doesn't contain a comma, the prefix will contain a comma
echo "${p}${REPLY}"; # print the line with the prefix which can be blank or not
done < test.txt
要编辑文件本身,请使用ed
:
printf "%sn" "v/,/s/^/ ,/" w | ed -s file
在没有逗号的每一行的开头插入一个空格和逗号,然后保存修改后的文件。