自定义排序并删除制表符分隔文件中多列下划线连接的双引号

自定义排序并删除制表符分隔文件中多列下划线连接的双引号


根据主题列顺序的自定义排序应为数学、英语、科学

当我使用下面的命令时

awk -F',' '{if (NR!=1) {print $2,$3,$5,$4}}' myfile.csv

在我的我的文件.csv我变得这样,但我想要其他方式

"101"    "Anna"    "Maths"    "V"
"102"    "Bob"    "Maths"    "V"
"103"    "Charles"    "Science"    "VI"
"104"    "Darwin"    "Science"    "VI"
"105"    "Eva"    "English"    "VII"

根据科目列顺序排序应为数学、英语、科学
删除双引号并用下划线连接,
如下所示

101_Anna_Maths_V
102_Bob_Maths_V
105_Eva_English_VII
103_Charles_Science_VI
104_Darwin_Science_VI

原始文件:输出cat myfile.csv

Sl.No,RollNo,Names,Class,Subject
1,101,Anna,V,Maths
2,102,Bob,V,Maths
3,103,Charles,VI,Science
4,104,Darwin,VI,Science
5,105,Eva,VII,English

答案1

你原来的命令:

awk -F',' '{if (NR!=1) {print $2,$3,$5,$4}}' myfile.csv

您的命令以惯用的awk方式编写:

awk -F',' 'NR > 1 { print $2, $3, $5, $4 }' myfile.csv

修改以上命令以删除每行输入的所有双引号NR > 1

awk -F',' 'NR > 1 { gsub(/"/, ""); print $2, $3, $5, $4 }' myfile.csv

上面的命令,修改为_以输出字段分隔符(OFS)输出:

awk -F',' -vOFS='_' 'NR > 1 { gsub(/"/, ""); print $2, $3, $5, $4 }' myfile.csv

答案2

由于问题已修改,使用以下sed解决方案针对给定的输入来获得

  1. 滑动字段 #4 和 #5
  2. 删除第一个字段
  3. 将逗号替换为下划线
  4. 跳过第一行作为标题
sed -r '2,$s/^[^,]*,// ; 2,$s/^([^,]*,[^,]*)(,[^,]*)(.*)/\1\3\2/ ; 2,$s/,/_/g'

使用sed

sed 's/"//g;s/[[:space:]]\+/_/g;/^$/d' infile
  • s/"//g这将删除所有引号"
  • [[:space:]]\+这会将一个或多个空格替换为单个下划线_
  • /^$/d这会删除空行,如果没有空行,您可以从命令中删除它。或更改为/^[[:space:]]*$/d仅删除带有空格/制表符/空的行。

如果您的实现不支持,请替换\+为标准等效项。\{1,\}sed

答案3

GNUawk逗号分隔输入文件的解决方案(根据您的-F','):

awk -v FPAT='[^",[:space:]]+' 'NR>1{ for(i=1;i<=NF;i++) printf "%s%s",$i,(i<NF)?OFS:ORS }' OFS='_' myfile.csv

输出:

01_Anna_Maths_V
102_Bob_Maths_V
103_Charles_Science_VI
104_Darwin_Science_VI
105_Eva_Maths_VII

相关内容