如何使用awk命令在管道分隔文件中仅从文件中获取奇数条目?

时间:2019-02-28 09:49:31

标签: shell unix awk

仅需要从管道分隔的文件中提取奇数列。

SOURCE_FILE
1|ABC|WORK|1234
2|DEF|OFFICE|5678
3|GHI|HOME|9012
4|JKL|PERSONAL|3456

预期产量

1|WORK
2|OFFICE
3|HOME
4|PERSONAL

我尝试使用awk -F'|' '{ for (i=1;i<=NF;i+=2) $i="" } 1' OFS="|" New2.txt >> delimt.txt,但它会删除值而不是位置。

3 个答案:

答案 0 :(得分:2)

第一种解决方案: 。能否请您尝试以下操作。

 awk 'BEGIN{FS=OFS="|"} {for(i=1;i<=NF;i+=2){val=(val?val OFS:"") $i};print val;val=""}' Input_file


第二个解决方案: :不使用变量,并且比第一个解决方案要快。请尝试以下方法。

awk 'BEGIN{FS=OFS="|"} {for(i=1;i<=NF;i+=2){printf("%s%s",$i,(i==NF ||i==(NF-1)) && i%2!=0?ORS:OFS)}}' Input_file

OR(添加上述解决方案的一个非衬里形式):

awk '
BEGIN{
  FS=OFS="|"
}
{
  for(i=1;i<=NF;i+=2){
    printf("%s%s",$i,(i==NF || i==(NF-1)) && i%2!=0?ORS:OFS)
  }
}
'   Input_file

输出如下。

1|WORK
2|OFFICE
3|HOME
4|PERSONAL

答案 1 :(得分:1)

另一个awk

 awk -F"|" -v OFS="|" ' { for(i=1;i<NF;i+=2) { printf("%s%s",s,$i);s="|"; } print "";s=""  } '

具有给定的输入

$ cat praveen.txt
1|ABC|WORK|1234
2|DEF|OFFICE|5678
3|GHI|HOME|9012
4|JKL|PERSONAL|3456

$ awk -F"|" -v OFS="|" ' { for(i=1;i<NF;i+=2) { printf("%s%s",s,$i);s="|"; } print "";s=""  } ' praveen.txt
1|WORK
2|OFFICE
3|HOME
4|PERSONAL

$

答案 2 :(得分:1)

您也可以使用coreutils进行此操作:

cols=$(head -n1 infile | tr '|' '\n' | wc -l)
cut -d'|' -f$(seq -s, 1 2 $cols) infile

输出:

1|WORK
2|OFFICE
3|HOME
4|PERSONAL