Awk 拆下'||';(双管)使用shell脚本命令从文件中分隔多个列
请建议使用完美的shell脚本命令从文件中删除最后两个以“| |”分隔符分隔的列。(假设下面的示例) 文件名:abc.datAwk 拆下'||';(双管)使用shell脚本命令从文件中分隔多个列,awk,grep,cut,Awk,Grep,Cut,请建议使用完美的shell脚本命令从文件中删除最后两个以“| |”分隔符分隔的列。(假设下面的示例) 文件名:abc.dat "a1"||"a2"||"a3"||"a4" "b1"||"b2"||"b3"||"b4" "c1"||"c2"||"c3"||"c4"
"a1"||"a2"||"a3"||"a4"
"b1"||"b2"||"b3"||"b4"
"c1"||"c2"||"c3"||"c4"
输出应如下所示:
"a1"||"a2"
"b1"||"b2"
"c1"||"c2"
我尝试了以下剪切和awk命令,但未成功:
awk -F '||' '{print $1$2}' ${file} >> ${file}
cut -d'||' -f2 --complement ${file} >> ${file} (not working as cut: the delimiter must be a single character)
有了您展示的样品,请尝试以下内容。将字段分隔符设置为
| |
(将其转义为处理文字字符),并将s设置为|
。然后打印每行输入文件的第一个和第二个字段
awk -F'\\|\\|' -v OFS="||" '{print $1,$2}' Input_file
一旦您对上述命令的结果满意,还要对输入文件本身进行更改,请尝试以下操作
awk -F'\\|\\|' -v OFS="||" '{print $1,$2}' Input_file > temp && mv temp Input_file
grep -oP '^.*?\|\|"[^"]*' Input_file
第二种解决方案:使用GNU
grep
尝试以下方法
awk -F'\\|\\|' -v OFS="||" '{print $1,$2}' Input_file > temp && mv temp Input_file
grep -oP '^.*?\|\|"[^"]*' Input_file
有了您展示的样品,请尝试以下内容。将字段分隔符设置为
| |
(将其转义为处理文字字符),并将s设置为|
。然后打印每行输入文件的第一个和第二个字段
awk -F'\\|\\|' -v OFS="||" '{print $1,$2}' Input_file
一旦您对上述命令的结果满意,还要对输入文件本身进行更改,请尝试以下操作
awk -F'\\|\\|' -v OFS="||" '{print $1,$2}' Input_file > temp && mv temp Input_file
grep -oP '^.*?\|\|"[^"]*' Input_file
第二种解决方案:使用GNU
grep
尝试以下方法
awk -F'\\|\\|' -v OFS="||" '{print $1,$2}' Input_file > temp && mv temp Input_file
grep -oP '^.*?\|\|"[^"]*' Input_file
您可以使用:
awk'{sub(/(\|{2}[^ |]*){2}$/,“”)1'文件
“a1”| |“a2”
“b1”| |“b2”
“c1”| |“c2”
或者,如果您只想删除最后2列,而不关心总共使用了多少列:
awk-F'\\\\{2}'-v OFS='\\\\''{
$NF=$(NF-1)=“”
sub(/([|]{2})*$/,“”)
}1'文件
您可以使用:
awk'{sub(/(\|{2}[^ |]*){2}$/,“”)1'文件
“a1”| |“a2”
“b1”| |“b2”
“c1”| |“c2”
或者,如果您只想删除最后2列,而不关心总共使用了多少列:
awk-F'\\\\{2}'-v OFS='\\\\''{
$NF=$(NF-1)=“”
sub(/([|]{2})*$/,“”)
}1'文件
与其假设|
是分隔符,不如假设|
是分隔符,第二个字段为空
$ cut -d'|' -f1-3 <<EOF
> "a1"||"a2"||"a3"||"a4"
> "b1"||"b2"||"b3"||"b4"
> "c1"||"c2"||"c3"||"c4"
> EOF
"a1"||"a2"
"b1"||"b2"
"c1"||"c2"
$cut-d'|'-f1-3“b1”| |“b2”| |“b3”| |“b4”
>“c1”| |“c2”| |“c3”| |“c4”
>EOF
“a1”| |“a2”
“b1”| |“b2”
“c1”| |“c2”
(这假设选择
|
是出于美观的原因,而不是为了在每个字段中都使用单个管道。)假设|
是分隔符,而不是假设|
是分隔符,第二个字段为空
$ cut -d'|' -f1-3 <<EOF
> "a1"||"a2"||"a3"||"a4"
> "b1"||"b2"||"b3"||"b4"
> "c1"||"c2"||"c3"||"c4"
> EOF
"a1"||"a2"
"b1"||"b2"
"c1"||"c2"
$cut-d'|'-f1-3“b1”| |“b2”| |“b3”| |“b4”
>“c1”| |“c2”| |“c3”| |“c4”
>EOF
“a1”| |“a2”
“b1”| |“b2”
“c1”| |“c2”
(这假设选择
|
是出于某种美学原因,而不是为了在每个字段中使用单根管道。)谢谢@RavinderSingh13的回复,您的解决方案工作得很好,只有一件事,我在最后使用第一个解决方案时得到了额外的“| |”。@R_Kalavadiya,对于您所展示的示例,这些解决方案对我来说效果很好。@R|u Kalavadiya是不可能的,因为您所展示的输入和答案中的脚本。感谢@RavinderSingh13的回复,您的解决方案效果很好,只有一件事,我在最后使用第一个解决方案时得到了额外的“| |”@R|u Kalavadiya,对于您所展示的示例,这些解决方案对我来说效果很好。@R|u Kalavadiya是不可能的,因为您展示了输入和答案中的脚本。如果|
之间有|
字符,则可能没有work@anubhava对我承认在最后一句中。如果|
之间有|
字符,则可能没有work@anubhava是的,我在最后一句中承认了这一点。