Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 拆下'||';(双管)使用shell脚本命令从文件中分隔多个列_Awk_Grep_Cut - Fatal编程技术网

Awk 拆下'||';(双管)使用shell脚本命令从文件中分隔多个列

Awk 拆下'||';(双管)使用shell脚本命令从文件中分隔多个列,awk,grep,cut,Awk,Grep,Cut,请建议使用完美的shell脚本命令从文件中删除最后两个以“| |”分隔符分隔的列。(假设下面的示例) 文件名:abc.dat "a1"||"a2"||"a3"||"a4" "b1"||"b2"||"b3"||"b4" "c1"||"c2"||"c3"||"c4"

请建议使用完美的shell脚本命令从文件中删除最后两个以“| |”分隔符分隔的列。(假设下面的示例) 文件名:abc.dat

"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是的,我在最后一句中承认了这一点。