我正在尝试创建一个脚本来修复这样的csv文件:
field_one,field_two,field_three
,field_two,field_three
所以我需要检查我的循环内部,如果当前行缺少field_one并用sed替换为field_one的新值(覆盖缺少field_one的行)。
为此,我有一个循环,但我需要一些帮助,以确定该行是否缺少第一个字段。我应该用grep?但如何在循环中使用它并得到它的响应?
while read -r line; do
# this is pseudocode:
# if $line matches regex then
# sed 's/,/newfieldone/'
# overwrite the corrected line in the file
# end if
done < my_file
非常感谢您的帮助!!!!
答案 0 :(得分:3)
在循环中,您可以运行以下sed命令:
sed 's/^\s*,/newfieldone,/'
答案 1 :(得分:2)
要查看某行是否以,
开头,因此缺少字段1,您可以使用if [[ "$line" =~ ^, ]]
。
例如:
while read -r line; do
if [[ "$line" =~ ^, ]]
then
echo "newfieldone$line"
else
echo "$line"
fi
done < my_file
答案 2 :(得分:2)
只是为了它,这是awk的解决方案:
awk '{FS=","} {if ($1 == "") print "field_one" $0;else print $0} ' < /tmp/test.txt
答案 3 :(得分:1)
sed -i 's/^,/fieldone,/' YOURFILE
将使用,
替换以fieldone,
开头的每一行(就地,因此原始文件会被覆盖,如果您需要备份,请尝试-i.backup
)。
如果你想要一个动态的fieldone
值,那么它取决于它是多么动态:-),例如:
MYDYNAMICFIELDONE="DYNAF1"
sed -i "s/^,/${MYDYNAMICFIELDONE},/" YOURFILE
或使用while
循环:
while read -r line; do
MYDYNAMICFIELDONE="SET IT"
sed -i "s/^,/${MYDYNAMICFIELDONE},/"
done < my_file > tmpfile
mv tmpfile my_file
或awk
:
awk '{
/^,/ {
DYNAF1="SET IT HERE"
print gensub("^,",DYNAF1 ",","g",$0)
}
} INPUT > OUTPUT
答案 4 :(得分:1)
$ sed -e "/^,/s/^,\([^,]*\),\([^,]\)/new_field_one,\1,\2/" < my_file
编辑:这可能太复杂了。采取其他一个好的答案:)
答案 5 :(得分:1)
这可能对您有用:
a=Field_one,Field_two,Field_three
sed '/^,/c\'$a'' file
field_one,field_two,field_three
Field_one,Field_two,Field_three
或者只是插入field_one
:
a=Field_one
sed '/^,/s/^/'$a'/' file
field_one,field_two,field_three
Field_one,field_two,field_three
答案 6 :(得分:1)
用sed尝试类似的东西:
sed -i 's|\(^,.*\)|new_field_one\1|g' <your file>
答案 7 :(得分:1)
使用case
语句的简单bash解决方案:
while read -r line; do
case "$line" in
,*) printf "%s%s\n" newfieldone "$line" ;;
*) printf "%s\n" "$line" ;;
esac
done < my_file
case
使用“glob”匹配,而不使用正则表达式,因此,*
匹配以逗号开头的字符串。
答案 8 :(得分:1)
这是一个非常简短的1-liner awk
awk '{$1="field_one"}1' FS=',' OFS=',' file.csv
答案 9 :(得分:1)
。 。 。和另一个awk
单行:
awk '$1==""{$1="field_one"}1' FS=',' OFS=',' file
答案 10 :(得分:0)
仅使用bash怎么样?
while IFS=\, read field_one field_two rest_of_line
echo "${field_one:-default_field_one_value},$field_two,$rest_of_line"
doen < my_file > my_corecct_file
如果'field_one'为空,则使用'default_field_one_value'