Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
打印列shell脚本的每个组件_Shell_Awk_Text Files_Sed - Fatal编程技术网

打印列shell脚本的每个组件

打印列shell脚本的每个组件,shell,awk,text-files,sed,Shell,Awk,Text Files,Sed,我有一个文本文件vis.degrib,如下所示: Wahu,Campos,California,Egypt,Parity,London,New York,Berlin,Washington 40,56,120,110,90,50,55,67,78 56,54,100,110,75,45,65,55,60 我正在尝试制作一个shell脚本,用于打印以下输出: Wahu Campos California Egypt Parity London New York Berlin Washington

我有一个文本文件vis.degrib,如下所示:

Wahu,Campos,California,Egypt,Parity,London,New York,Berlin,Washington
40,56,120,110,90,50,55,67,78
56,54,100,110,75,45,65,55,60
我正在尝试制作一个shell脚本,用于打印以下输出:

Wahu
Campos
California
Egypt
Parity
London
New York
Berlin
Washington
这只是打印第一行,但让x循环遍历第一行的每一列,并打印输出该列x(列之间用、)分隔)

以下是该计划的示例:

#!/bin/bash
VIS_LOCNAMES=""
INPUT=vis.degrib
linecount=0
while read line
do
    echo "SFH-LINE:"
    echo ". $linecount ."
    echo ". $line ."
    if [ $linecount == 0 ];
    then
        VIS_LOCNAMES=$line
    fi
    let linecount++
done < $INPUT

echo ""
echo ""
echo "Locations are $VIS_LOCNAMES"

LOC_NUMBER=`echo $VIS_LOCNAMES | awk '{print NF}'`

while [[ x -le $LOC_NUMBER ]];
do
    echo "$x"
    echo "--------------------------"
    echo $VIS_LOCNAMES | awk 'FS="," {print $x}'
    let x++
done
#/bin/bash
VIS_LOCNAMES=“”
输入=vis.degrib
行数=0
读行时
做
回显“SFH-LINE”:
回显“$linecount”
回音:“$line”
如果[$linecount==0];
然后
VIS_LOCNAMES=$line
fi
让我们数一数++
完成<$INPUT
回声“”
回声“”
echo“位置是$VIS_LOCNAMES”
LOC_NUMBER=`echo$VIS_LOCNAMES | awk'{print NF}'`
而[[x-le$LOC_编号]];
做
回音“$x”
回声“-----------------------------------”
echo$VIS_LOCNAMES | awk'FS=“,”{print$x}”
让x++
完成

最后,我还希望根据我提到的第一行文件中指定的位置使用一系列文件。例如,我想创建“Egypt、csv、Wahu、csv等”,这就是为什么我想让x循环通过第一行的位置列。我最终将设置它,以便$file=`echo$VIS|u LOCNAMES | awk'FS=“,”{num=$x;print$num}”。我需要帮助来调整这部分代码,以便得到我想要的结果

你知道怎么做吗

谢谢您的时间。

您可以试一下。它将第一行与
1
匹配,将所有逗号替换为换行符,然后全部打印并退出

sed -n '1 { s/,/\n/g; p; q }' infile
它产生:

Wahu
Campos
California
Egypt
Parity
London
New York
Berlin
Washington
你可以试试。它将第一行与
1
匹配,将所有逗号替换为换行符,然后全部打印并退出

sed -n '1 { s/,/\n/g; p; q }' infile
它产生:

Wahu
Campos
California
Egypt
Parity
London
New York
Berlin
Washington
使用
awk

awk -F , -v OFS='\n' '{$1=$1;print;exit}' vis.degrib
  • -F,
    上拆分,
  • -v OFS='\n'
    使用换行符作为新的字段分隔符
  • $1=$1
    强制awk拆分并重新组合输入行(通常我认为这应该是
    $0=$0
    ,但出于某种原因,这似乎不起作用)
  • 打印
    重新组合的行
  • 退出
    ,因为我们只想打印第一行
    • 带有
      awk

      awk -F , -v OFS='\n' '{$1=$1;print;exit}' vis.degrib
      
      • -F,
        上拆分,
      • -v OFS='\n'
        使用换行符作为新的字段分隔符
      • $1=$1
        强制awk拆分并重新组合输入行(通常我认为这应该是
        $0=$0
        ,但出于某种原因,这似乎不起作用)
      • 打印
        重新组合的行
      • 退出
        ,因为我们只想打印第一行
      另一种选择

      head -1 <vis.degrib | tr ',' '\n'
      
      awk -F, 'NR==1{for(i=1;i<=NF;i++) print "" > $i".csv"}'
      
      head-1另一种选择

      head -1 <vis.degrib | tr ',' '\n'
      
      awk -F, 'NR==1{for(i=1;i<=NF;i++) print "" > $i".csv"}'
      

      head-1我最终还希望根据我提到的第一行文件中指定的位置使用一系列文件。例如,我想创建“Egypt、csv、Wahu、csv等”,这就是为什么我想让x循环通过第一行的位置列。我最终将设置它,以便$file=`echo$VIS|u LOCNAMES | awk'FS=“,”{num=$x;print$num}”。我需要帮助来调整这部分代码,以得到我想要的结果。不要在评论中扩展你的问题。在问题中贴出完整的问题。我不是英语老师,但我也不是透视者,所以我不知道下面的意思是什么:“这只是打印第一行,但是在第一行的每一列都有x个循环,并打印输出该列x”你能把它重新表述为连贯的吗?我最终还想根据我提到的第一行文件中指定的位置使用一系列文件。例如,我想创建“Egypt、csv、Wahu、csv等”,这就是为什么我想让x循环通过第一行的位置列。我最终将设置它,以便$file=`echo$VIS|u LOCNAMES | awk'FS=“,”{num=$x;print$num}”。我需要帮助来调整这部分代码,以得到我想要的结果。不要在评论中扩展你的问题。在问题中贴出完整的问题。我不是英语老师,但我也不是透视者,所以我不知道下面的意思是什么:“这只是打印第一行,但是第一行的每一列都有x个循环,并打印输出该列x”你能重新措辞以保持连贯性吗?