我有这样一个csv文件:
,College Level Math 55,Elementary Algebra 112
,Elementary Algebra 79,
,College Level Math 102,Elementary Algebra 54
,,College Level Math 54我需要执行以下操作的awk或sed命令
如果College Level Math *,Elementary Alegrbra *存在,则翻转它,使其看起来像
Elementary Algebra *, College Level Math *期望输出
,Elementary Algebra 112,College Level Math 55
,Elementary Algebra 79,
,Elementary Algebra 54,College Level Math 102
,,College Level Math 54我的问题是,我不知道在结尾的数字,或它是否将是2或3位数。
我知道如何翻转它,如果每次都是完全相同的文字。
sed -e 's/College Level Math,Elementary Algebra/Elementary Algebra,College Level Math/g'但是数字变量让我不知所措。
发布于 2015-06-17 00:30:08
在扩展正则表达式中使用sed:
sed -r 's/(College Level Math.*?),(Elementary Algebra.*)/\2,\1/g' filepath\1是第一个捕获的组(College Level Math.*?)
\2是第二个捕获组(Elementary Algebra.*)。
因此,上面的sed执行从\1,\2到\2,\1的替换操作。
上述正则表达式适用于一般情况,但在以下情况下将失败:
,College Level Math 55,Elementary Algebra 111,Elementary Algebra 112
#\1=College Level Math 55,Elementary Algebra 111
,College Level Math 55,College Level Math 55,Elementary Algebra 112
#\1=College Level Math 55,College Level Math 55因此,最好不要使用像.*这样的贪婪正则表达式,相反,如果条目是逗号分隔的,则应该使用以下命令:
sed -r 's/(College Level Math[^,]*),(Elementary Algebra[^,]*)/\2,\1/g' filepath发布于 2015-06-16 23:49:33
在正则表达式中使用俘获:
sed 's/\(College Level Math[^,]*\),\(Elementary Algebra[^,]*\)/\2,\1/'编辑:在我以前的一个答复中,有人向我指出,为了将括号从文字转换为元字符而对括号进行转义是不符合POSIX的,因此也不像它可能的那样可移植。如果您需要考虑可移植性,可以省略\,只需使用-r选项来启用扩展正则表达式语法,如Jahid的答案所示。
发布于 2015-06-16 23:52:48
$ awk 'BEGIN{FS=OFS=","} $2!="" && $3!=""{t=$2;$2=$3;$3=t} 1' file
,Elementary Algebra 112,College Level Math 55
,Elementary Algebra 79,
,Elementary Algebra 54,College Level Math 102
,,College Level Math 54https://stackoverflow.com/questions/30879728
复制相似问题