从分隔文件中捕获特定列

时间:2014-02-19 02:31:32

标签: bash shell unix

我是shell脚本的新手,我需要创建一个具有以下条件的shell脚本。

shell脚本应该读取每行的Inputfile.txt并获取文件中的第一和第六列并创建一个新的outputfile.txt

Inputfile.txt

123 | xyz | abc | abc | abc | 567

321 | xyz | abc | abc | abc | 765

Outputfile.txt

123 | 567

321 | 765

4 个答案:

答案 0 :(得分:6)

使用简单的剪切命令就足够了:

cut -d "|" -f 1,6

答案 1 :(得分:2)

捕获第一个和第六个项目,然后用竖线分隔打印出来:

$ awk -F'|' '{print $1 "|" $6}' inputfile.txt 
123 | 567 321

-F'|'告诉awk使用竖线作为输入文件的字段分隔符。

要在outputfile.txt中保存上述输出,请使用重定向:

$ awk -F'|' '{print $1 "|" $6}' inputfile.txt >outputfile.txt

或者,通过将awk的输出字段分隔符(OFS)设置为垂直条,可以获得相同的结果:

$ awk -F'|' 'BEGIN{OFS="|"} {print $1,$6}' inputfile.txt >outputfile.txt

答案 2 :(得分:1)

如果您不想使用任何工具,那么这里是获取bash中第一个和最后一个元素的方法:

$ cat inputfile.txt 
123 | xyz | abc | abc | abc | 567
321 | xyz | abc | abc | abc | 765

$ while IFS="|" read -ra line; do 
    echo "${line[0]}|${line[${#line[@]}-1]}"
done < inputfile.txt 
123 | 567
321 | 765

您也可以使用文字下标,因此您可以${line[${#line[@]}-1]}代替${line[5]}

答案 3 :(得分:0)

你也可以使用awk

awk  '{print $1, $10, $11}' input.txt

(OR)

awk -F'|' '{print $1 "|" $6  $11}' input.txt

(OR)

awk '{print $1, $11}' input.txt

(OR)

您只需使用cut命令:

cut -d"|" -f 1,6

(OR)

使用sed

sed 's/|.*|/|/' input.txt

还有grep ......但我对此并不熟悉:)

另外:@anubhava告诉我:

awk -F '[| ]+' '{print $1, $NF}' OFS=' | ' input.txt

(OR)

while IFS=' | ' read -a arr
    echo "${arr[0]} | ${arr[@]:(-1)}"
done < input.txt